Qual è la differenza tra parent.frame () e parent.env () in R; come si differenziano nella chiamata per riferimento?


84

Sarebbe utile se qualcuno potesse illustrarlo con un semplice esempio?

Inoltre, dove sarebbe utile utilizzare al parent.frame()posto di parent.env()e viceversa.

Risposte:


99

parent.envè l'ambiente in cui viene definita una chiusura (ad esempio, una funzione). parent.frameè l'ambiente da cui è stata invocata 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>

Non sono sicuro di quando un semplice mortale vorrebbe davvero usarli, ma i concetti sono utili per comprendere l'ambito 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'enigmatico esempio di "conto bancario" nell'Introduzione a R. Il primo paragrafo della sezione Dettagli di ?parent.framepotrebbe chiarire le cose.

Gli ambienti sono pervasivi in ​​R, ad esempio, il search()percorso è (approssimativamente) ambienti concatenati insieme in una relazione fratello -> genitore. A volte si vede env = new.env(parent=emptyenv())per aggirare la ricerca dei simboli - normalmente env[["x"]]si cercherebbe prima nel genitore di env, e poi nel envgenitore di se non trovato. Allo stesso modo, <<-cerca il compito che inizia in 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).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.