在 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
我希望 g
在 f
的环境中进行评估,以便 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)
}
假设我有以下功能:
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
将绑定到 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)
}