在 R 中 Parent.frame()和 Parent.env()之间有什么区别; 它们在引用调用方面有什么不同?

如果有人能用一个简单的例子来说明这一点,那将会很有帮助?

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

33710 次浏览

parent.env is the environment in which a closure (e.g., function) is defined. parent.frame is the environment from which the closure was invoked.

f = function()
c(f=environment(), defined_in=parent.env(environment()),
called_from=parent.frame())
g = function()
c(g=environment(), f())

and then

> g()
$g
<environment: 0x14060e8>


$f
<environment: 0x1405f28>


$defined_in
<environment: R_GlobalEnv>


$called_from
<environment: 0x14060e8>

I'm not sure when a mere mortal would ever really want to use them, but the concepts are useful in understanding lexical scope here

> 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

or in the enigmatic 'bank account' example in the Introduction to R. The first paragraph of the Details section of ?parent.frame might clarify things.

Environments are pervasive in R, e.g., the search() path is (approximately) environments chained together in a sibling -> parent relationship. One sometimes sees env = new.env(parent=emptyenv()) to circumvent symbol look-up -- normally env[["x"]] would look first in env, and then in env's parent if not found. Likewise, <<- looks for assignment starting in the parent.env. The relatively new reference class implementation in R relies on these ideas to define an instance-specific environment in which symbols (instance fields and methods) can be found.