【问题标题】:Binding outside variables in R在 R 中绑定外部变量
【发布时间】:2017-02-06 00:45:18
【问题描述】:

假设我有以下功能:

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)?

【问题讨论】:

  • 我没有答案,但似乎 R 会在全局范围内查找所有未在函数调用中定义或作为参数传递的变量。

标签: r function binding environment


【解决方案1】:

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

定义函数时设置封闭环境。如果在 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)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-14
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多