2011-09-16 25 views

Odpowiedz

88

parent.env jest środowiskiem, w którym zdefiniowano zamknięcie (np. Funkcję). parent.frame jest środowiskiem, z którego wywołano zamknięcie.

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

a następnie

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

$f 
<environment: 0x1405f28> 

$defined_in 
<environment: R_GlobalEnv> 

$called_from 
<environment: 0x14060e8> 

Nie jestem pewien, kiedy zwykły śmiertelnik nigdy naprawdę chcesz z nich korzystać, ale pojęcia są przydatne w zrozumieniu zakresu leksykalnego tutaj

> 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 

lub w enigmatycznym przykładzie "rachunku bankowego" we Wprowadzeniu do R. Pierwszy akapit sekcji Szczegóły w ?parent.frame może wyjaśnić pewne kwestie.

Środowiska są wszechobecne w R, np. Ścieżka search() jest (w przybliżeniu) otoczona łańcuchem w relacji rodzeństwa -> rodzica. Czasami widzi się env = new.env(parent=emptyenv()), aby obejść wyszukiwanie symbolu - zwykle env[["x"]] będzie wyglądał najpierw w env, a następnie w rodzicu env, jeśli nie zostanie znaleziony. Podobnie, <<- szuka przydziału zaczynając od parent.env. Stosunkowo nowa implementacja klasy odniesienia w R opiera się na tych pomysłach w celu zdefiniowania środowiska specyficznego dla instancji, w którym można znaleźć symbole (pola instancji i metody).