¿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.

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).

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.