首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R中的外部变量绑定

R中的外部变量绑定
EN

Stack Overflow用户
提问于 2017-02-06 00:45:18
回答 1查看 272关注 0票数 6

假设我有以下函数:

代码语言:javascript
复制
g = function(x) x+h

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

代码语言:javascript
复制
h = 4
g(2)

## should be 6

现在,我还有另一个功能:

代码语言:javascript
复制
f = function() {
    h = 3
    g(2)
}

我希望:

代码语言:javascript
复制
rm(h)
f()

## should be 5, isn't it?

相反,我得到了一个错误

代码语言:javascript
复制
## Error in g(2) : object 'h' not found

我希望gf环境中得到评估,这样f中的h将绑定到h in g中,就像我在.GlobalEnv中执行g时一样。这种情况没有发生(很明显)。有什么解释吗?如何克服这一问题,以便使用封闭环境评估函数中的函数(例如g)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-06 01:09:34

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

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

代码语言:javascript
复制
g = function(x) x+h

然后g的封闭环境将是全球环境。现在,如果从另一个函数调用g

代码语言:javascript
复制
f = function() {
    h = 3
    g(2)
}

父评估框架是f的环境,但这不会改变g的封闭环境,这是一个固定的属性,它不取决于计算的位置,这就是为什么它不会获取在f中定义的h的值。

如果您希望g使用在f中定义的h的值,那么您也应该在f中定义g

代码语言:javascript
复制
f = function() {
    h = 3
    g = function(x) x+h
    g(2)
}

现在,g的封闭环境将是f的环境(但请注意,此g与您先前在R提示符下创建的g不同)。

或者,您可以按以下方式修改g的封闭环境:

代码语言:javascript
复制
f = function() {
    h = 3
    environment(g) <- environment()
    g(2)
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42059004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档