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

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

最佳答案

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

关于r - R 中的 parent.frame() 和 parent.env() 有什么区别;它们在引用调用上有何不同?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7439110/

10-16 20:16