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使用封闭环境评估函数(例如)中的函数?
函数的封闭环境与其(父)评估框架之间存在差异.
定义函数时将设置封闭环境.如果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,则还应g在f以下内容中定义:
f = function() {
h = 3
g = function(x) x+h
g(2)
}
Run Code Online (Sandbox Code Playgroud)
现在g的封闭环境将是f环境(但请注意,这g与g您之前在R提示符下创建的环境不同).
或者,您可以修改封闭环境,g如下所示:
f = function() {
h = 3
environment(g) <- environment()
g(2)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
131 次 |
| 最近记录: |