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).