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

Sarebbe utile se qualcuno potesse illustrarlo con un semplice esempio?

Inoltre, dove sarebbe utile usare parent.frame() invece di parent.env() e viceversa.

parent.env è l’ambiente in cui è definita una chiusura (ad esempio, una 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  $f  $defined_in  $called_from  

Non sono sicuro che un semplice mortale vorrebbe davvero usarli, ma i concetti sono utili per comprendere lo scopo 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 si vede env = new.env(parent=emptyenv()) per aggirare la ricerca dei simboli – normalmente env[["x"]] dovrebbe apparire prima in env , e poi nel genitore di env se non trovato. Allo stesso modo, <<- cerca il compito che inizia in parent.env . L'implementazione relativamente nuova della class di riferimento in R si basa su queste idee per definire un ambiente specifico dell'istanza in cui è ansible trovare simboli (campi e metodi dell'istanza).