如果有人可以用一个简单的例子来说明这一点会有所帮助吗?
此外,在哪里使用 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/