假设我有以下函数:
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我希望g在f环境中得到评估,这样f中的h将绑定到h in g中,就像我在.GlobalEnv中执行g时一样。这种情况没有发生(很明显)。有什么解释吗?如何克服这一问题,以便使用封闭环境评估函数中的函数(例如g)?
发布于 2017-02-06 01:09:34
函数的封闭环境与其(父)评估框架之间存在差异。
在定义函数时设置封闭环境。如果在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与您先前在R提示符下创建的g不同)。
或者,您可以按以下方式修改g的封闭环境:
f = function() {
h = 3
environment(g) <- environment()
g(2)
}https://stackoverflow.com/questions/42059004
复制相似问题