2011-09-16 15 views

Respuesta

88

parent.env es el entorno en el que se define un cierre (por ejemplo, una función). parent.frame es el entorno desde el que se invoca el cierre.

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

y luego

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

$f 
<environment: 0x1405f28> 

$defined_in 
<environment: R_GlobalEnv> 

$called_from 
<environment: 0x14060e8> 

no estoy seguro de que cuando un simple mortal alguna vez realmente quieren utilizarlos, pero los conceptos son útiles en la comprensión de ámbito 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 ejemplo enigmático de "cuenta bancaria" en la Introducción a R. El primer párrafo de la sección de Detalles de ?parent.frame podría aclarar las cosas.

Los entornos son omnipresentes en R, por ejemplo, la ruta search() es (aproximadamente) entornos encadenados juntos en una relación hermano -> padre. A veces se ve env = new.env(parent=emptyenv()) para eludir la búsqueda de símbolos: normalmente env[["x"]] se vería primero en env, y luego en env si no se encuentra el padre. Del mismo modo, <<- busca la asignación que comienza en el parent.env. La implementación de 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 y métodos de instancia).

Cuestiones relacionadas