What is the difference between parent.frame() and parent.env() in R; how do they differ in call by reference?
environment, function-call, r, stack-frame
Solution
`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.
Problem
It would be helpful if someone can illustrate this with a simple example? Also, where would it be useful to use `parent.frame()` instead of `parent.env()` and vice versa.