88

如果有人可以用一个简单的例子来说明这一点会很有帮助吗?

此外,在哪里使用parent.frame()而不是,parent.env()反之亦然。

4

1 回答 1

103

parent.env是定义闭包(例如,函数)的环境。parent.frame是调用闭包的环境。

f = function() 
     c(f=environment(), defined_in=parent.env(environment()),  
       called_from=parent.frame())
g = function() 
     c(g=environment(), f())

进而

> g()
$g
<environment: 0x14060e8>

$f
<environment: 0x1405f28>

$defined_in
<environment: R_GlobalEnv>

$called_from
<environment: 0x14060e8>

我不确定一个普通人什么时候会真正想要使用它们,但是这些概念对于理解这里的词汇范围很有用

> f = function() x
> g = function() { x = 2; f() }
> h = function() { x = 3; function() x }
> x = 1
> f()
[1] 1
> g()
[1] 1
> h()()
[1] 3

或在 R 简介中神秘的“银行账户”示例中。细节部分的第一段?parent.frame可能会澄清一些事情。

环境在 R 中无处不在,例如,search()路径是(大约)以兄弟 -> 父关系链接在一起的环境。有时会env = new.env(parent=emptyenv())绕过符号查找——通常env[["x"]]会先在 中查找,如果未找到env,则在env的父项中查找。同样,<<-查找从parent.env. R 中相对较新的参考类实现依赖于这些想法来定义一个特定于实例的环境,在该环境中可以找到符号(实例字段和方法)。

于 2011-09-16T02:35:47.790 回答