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.

Original source