r - R 函数中的变量范围

标签 r variables scope environments

我想以灵活的方式指定功能。当我在它之后创建另一个函数时,如何确保给定函数的环境不会改变。

为了说明,这可以正常工作:

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/

相关文章:

r - 检查 html 是否可用

r - 使用权重向量设置 networkD3 节点大小

要包含的 PHP 传递变量

Javascript 闭包和内部作用域

r - 警告 : unable to access index for repository internet routines cannot be loaded

r - 将最大似然估计的系数放入观星表中

PHP变量和MySQL查询

javascript - 在具有值的表单中使用图像作为选项

python OOP 类方法保留变量。奇怪的范围界定事情

c++ - 如何在 C++ 中创建带返回值的内联作用域?