Jaka jest różnica między parent.frame () i parent.env () w R; czym różnią się rozmową przez odniesienie?

84

Byłoby pomocne, gdyby ktoś mógł to zilustrować prostym przykładem?

Ponadto, gdzie warto byłoby użyć parent.frame()zamiast parent.env()i odwrotnie.

suncoolsu
źródło

Odpowiedzi:

99

parent.envto środowisko, w którym zdefiniowane jest zamknięcie (np. funkcja). parent.frameto środowisko, 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())

i wtedy

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

$f
<environment: 0x1405f28>

$defined_in
<environment: R_GlobalEnv>

$called_from
<environment: 0x14060e8>

Nie jestem pewien, kiedy zwykły śmiertelnik naprawdę chciałby ich użyć, ale pojęcia są przydatne w zrozumieniu zakresu leksykalnego

> 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 „konta bankowego” we wstępie do R. Pierwszy akapit sekcji „Szczegóły” ?parent.framemoże wyjaśnić pewne kwestie.

Środowiska są wszechobecne w R, np. search()Ścieżka to (w przybliżeniu) środowiska połączone razem w relacji rodzeństwo -> rodzic. Czasami zdarza się, że env = new.env(parent=emptyenv())można obejść wyszukiwanie symboli - normalnie env[["x"]]szuka się najpierw do env, a następnie do envrodzica, jeśli nie zostanie znaleziony. Podobnie <<-szuka przypisania rozpoczynającego się w parent.env. Stosunkowo nowa implementacja klasy referencyjnej w R opiera się na tych pomysłach, aby zdefiniować specyficzne dla instancji środowisko, w którym można znaleźć symbole (pola i metody instancji).

Martin Morgan
źródło