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).
fonte
2011-09-16 02:35:47