R函数中的变量作用域

7
我希望以灵活的方式指定函数。当我在创建另一个函数时,如何确保给定函数的环境不会改变。
举个例子,以下代码可以正常工作:
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
1个回答

8
这是由于惰性求值引起的。函数直到被调用才会真正构建。因此,在第二种情况下,两次都选择了新版本的 a。另请参见 这个问题
您可以通过使用 force 来解决此问题:
make.fn2 <- function(a, b) {
    force(a)
    force(b)
    fn2 <- function(x) {
        return( x + a + b )
    }
    return( fn2 )
}

这将强制函数在创建时捕获ab的值,而不是在调用函数时。它会产生正确的输出:

> 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
> 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接