R中的parent.frame()和parent.env()有什么区别;他们如何通过引用来区分?

时间:2011-09-16 01:00:12

标签: r environment function-call stackframe

如果有人能用一个简单的例子说明这一点会有所帮助吗?

此外,使用parent.frame()代替parent.env()会有用,反之亦然。

1 个答案:

答案 0 :(得分:93)

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()路径是(大约)在兄弟中链接在一起的环境 - &gt;父母关系。有时会看到env = new.env(parent=emptyenv())绕过符号查找 - 通常env[["x"]]会先查看env,然后查找env的父亲(如果找不到)。同样,<<-查找从parent.env开始的作业。 R中相对较新的引用类实现依赖于这些想法来定义特定于实例的环境,其中可以找到符号(实例字段和方法)。