¿Cuál es la diferencia entre parent.frame () y parent.env () en R; ¿en qué se diferencian en llamada por referencia?

84

¿Sería útil que alguien pudiera ilustrar esto con un ejemplo simple?

Además, dónde sería útil usar en parent.frame()lugar de parent.env()y viceversa.

suncoolsu
fuente

Respuestas:

99

parent.enves el entorno en el que se define un cierre (por ejemplo, función). parent.framees el entorno desde el que se invocó el cierre.

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

y entonces

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

$f
<environment: 0x1405f28>

$defined_in
<environment: R_GlobalEnv>

$called_from
<environment: 0x14060e8>

No estoy seguro de cuándo un simple mortal querría usarlos, pero los conceptos son útiles para comprender el alcance léxico aquí.

> 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

o en el enigmático ejemplo de 'cuenta bancaria' en la Introducción a R. El primer párrafo de la sección Detalles de ?parent.framepodría aclarar las cosas.

Los entornos son omnipresentes en R, por ejemplo, el search()camino es (aproximadamente) entornos encadenados juntos en una relación hermano -> padre. A veces, uno ve env = new.env(parent=emptyenv())para eludir la búsqueda de símbolos; normalmente env[["x"]], buscaría primero dentro envy luego en envel padre en si no se encuentra. Asimismo, <<-busca una asignación que comience en parent.env. La implementación de la clase de referencia relativamente nueva en R se basa en estas ideas para definir un entorno específico de instancia en el que se pueden encontrar símbolos (campos de instancia y métodos).

Martín Morgan
fuente