在R语言中,parent.frame()和parent.env()有什么区别?它们在按引用调用方面有何不同?

91
有没有人可以用简单的例子来说明这个问题会很有帮助?
此外,在什么情况下使用parent.frame()比使用parent.env() 更实用,反之亦然。
1个回答

106

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语言中,环境是普遍存在的。例如search()路径是由兄弟关系和父子关系构成的一系列环境。有时候会看到env = new.env(parent=emptyenv())这样的用法,它可以绕开符号查找的规则,通常情况下env[["x"]]会先在当前env中查找,如果没找到再到其父环境中查找。同样地,<<-操作也是从parent.env开始寻找赋值对象的。R语言中相对较新的引用类实现依赖于这些思想来定义一个特定于实例的环境,在该环境中可以找到符号(即实例字段和方法)。若想了解更多,请参考?parent.frame中Details节的第一段。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接