2011-09-16 10 views

risposta

88

parent.env è l'ambiente in cui è definita una chiusura (ad es. Funzione). parent.frame è l'ambiente da cui è stata richiamata la chiusura.

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

e poi

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

$f 
<environment: 0x1405f28> 

$defined_in 
<environment: R_GlobalEnv> 

$called_from 
<environment: 0x14060e8> 

io non sono sicuro che quando un comune mortale avrebbe mai voglia di usarli, ma i concetti sono utili nella comprensione scope lessicale qui

> 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 nell'esempio enigmatico "conto bancario" nell'Introduzione a R. Il primo paragrafo della sezione Dettagli di ?parent.frame potrebbe chiarire le cose.

Gli ambienti sono pervasivi in ​​R, ad esempio il percorso search() è (approssimativamente) ambienti concatenati in una relazione fratello -> genitore. A volte viene visualizzato env = new.env(parent=emptyenv()) per aggirare la ricerca dei simboli: normalmente env[["x"]] cerca prima in env e quindi nel genitore env se non trovato. Allo stesso modo, <<- cerca assegnazioni a partire dal parent.env. L'implementazione relativamente nuova della classe di riferimento in R si basa su queste idee per definire un ambiente specifico dell'istanza in cui è possibile trovare simboli (campi e metodi dell'istanza).

Problemi correlati