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
4

1 回答 1

8

这是由于惰性评估。该函数在被调用之前并未真正构造。因此,在第二种情况下,两次都a选择了新版本。另请参阅this other question

您可以使用以下方法解决此问题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
> 
于 2014-02-07T13:26:11.953 回答