我想以灵活的方式指定功能。当我在它之后创建另一个函数时,如何确保给定函数的环境不会改变。
为了说明,这可以正常工作:
make.fn2 <- function(a, b) {
fn2 <- function(x) {
return( x + a + b )
}
return( fn2 )
}
a <- 2; b <- 3
fn2.1 <- make.fn2(a, b)
fn2.1(3) # 8
fn2.1(4) # 9
a <- 4
fn2.2 <- make.fn2(a, b)
fn2.2(3) # 10
fn2.1(3) # 8
这不
make.fn2 <- function(a, b) {
fn2 <- function(x) {
return( x + a + b )
}
return( fn2 )
}
a <- 2; b <- 3
fn2.1 <- make.fn2(a, b)
a <- 4
fn2.2 <- make.fn2(a, b)
fn2.1(3) # 10
fn2.1(4) # 11
fn2.2(3) # 10
fn2.1(3) # 10
最佳答案
这是由于懒惰的评估。该函数直到被调用时才真正被构造。所以,在第二种情况下,新版本 a
被拾起。另见 this other question .
您可以使用 force
解决此问题。 :
make.fn2 <- function(a, b) {
force(a)
force(b)
fn2 <- function(x) {
return( x + a + b )
}
return( fn2 )
}
这会强制函数获取
a
的值和 b
在创建函数时,而不是在调用函数时。它产生正确的输出:> a <- 2; b <- 3
> fn2.1 <- make.fn2(a, b)
>
> a <- 4
> fn2.2 <- make.fn2(a, b)
>
> fn2.1(3) # 10
[1] 8
> fn2.1(4) # 11
[1] 9
> fn2.2(3) # 10
[1] 10
> fn2.1(3) # 10
[1] 8
>
关于r - R 函数中的变量范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21628656/