在 R 中绑定外部变量

Binding outside variables in R

假设我有以下功能:

g = function(x) x+h

现在,如果我的环境中有一个名为 h 的对象,我就不会有任何问题:

h = 4
g(2)

## should be 6

现在,我有另一个功能:

f = function() {
    h = 3
    g(2)
}

我预计:

rm(h)
f()

## should be 5, isn't it?

相反,我得到一个错误

## Error in g(2) : object 'h' not found

我希望 gf 的环境中进行评估,以便 f 中的 h 将绑定到 g 中的 h,如那是我在 .GlobalEnv 中执行 g 的时候。这不会发生(显然)。任何解释为什么?如何克服这个问题,以便使用封闭环境评估函数内的函数(例如 g)?

函数的封闭环境与其(父)评估框架

之间存在差异

封闭环境是在定义函数时设置的。如果您在 R 提示符下定义函数 g

g = function(x) x+h

那么g的封闭环境就是全局环境。现在,如果您从另一个函数调用 g

f = function() {
    h = 3
    g(2)
}

父评价框架是f的环境。但这不会改变 g 的封闭环境,这是一个固定属性,不依赖于它的计算位置。这就是为什么它不会获取在 f.

中定义的 h 的值的原因

如果您希望g使用f中定义的h的值,那么您还应该在f中定义g:

f = function() {
    h = 3
    g = function(x) x+h
    g(2)
}

现在 g 的封闭环境将是 f 的环境(但请注意,这个 g 与您之前创建的 g 不同在 R 提示符下)。

或者,您可以修改 g 的封闭环境,如下所示:

f = function() {
    h = 3
    environment(g) <- environment()
    g(2)
}