在R中绑定外部变量

ami*_*mit 6 environment binding r function

假设我有以下功能:

g = function(x) x+h
Run Code Online (Sandbox Code Playgroud)

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

h = 4
g(2)

## should be 6
Run Code Online (Sandbox Code Playgroud)

现在,我有另一个功能:

f = function() {
    h = 3
    g(2)
}
Run Code Online (Sandbox Code Playgroud)

我希望:

rm(h)
f()

## should be 5, isn't it?
Run Code Online (Sandbox Code Playgroud)

相反,我得到一个错误

## Error in g(2) : object 'h' not found
Run Code Online (Sandbox Code Playgroud)

我期望g在环境中进行评估f,以便hin f将被绑定到h in g,就像我g在内部执行时一样.GlobalEnv.这显然不会发生(显然).任何解释为什么?如何克服这个问题,以便g使用封闭环境评估函数(例如)中的函数?

Hon*_*Ooi 7

函数的封闭环境与其(父)评估框架之间存在差异.

定义函数时将设置封闭环境.如果g在R提示符下定义函数:

g = function(x) x+h
Run Code Online (Sandbox Code Playgroud)

那么封闭的环境就是g全球环境.现在如果你g从另一个函数调用:

f = function() {
    h = 3
    g(2)
}
Run Code Online (Sandbox Code Playgroud)

父评估框架是f环境.但这不会改变g封闭环境,这是一个固定的属性,不依赖于它的评估位置.这就是为什么它不会获取其中h定义的值的原因f.

如果要g使用h内部定义的值f,则还应gf以下内容中定义:

f = function() {
    h = 3
    g = function(x) x+h
    g(2)
}
Run Code Online (Sandbox Code Playgroud)

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

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

f = function() {
    h = 3
    environment(g) <- environment()
    g(2)
}
Run Code Online (Sandbox Code Playgroud)