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


84

有人可以用一个简单的例子来说明这一点吗?

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

Answers:


99

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中相对较新的引用类实现依靠这些思想来定义一个特定于实例的环境,在该环境中可以找到符号(实例字段和方法)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.