¿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:
parent.env
es el entorno en el que se define un cierre (por ejemplo, función). parent.frame
es 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.frame
podrí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 env
y luego en env
el 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).