2011-10-26 13 views
14

Chcę lepiej zrozumieć, w jaki sposób powiązane są ,i frames. Rozumiem, że zamknięcia funkcji zawierają środowisko, środowiska zawierają ramkę i obudowę, a ramki zawierają zmienne, ale jestem trochę rozmyta na temat tego, jak się ze sobą komunikują.W jaki sposób środowiska, (en) domknięcia i ramki są powiązane?

Być może pomoże Ci przykład tego, co dzieje się podczas wywoływania funkcji? A może schemat?

+0

@DirkEddelbuettel: To nie skromność; kucyki są niechlujne. Nie czytałem tego. Odbiorę kopię i odpowiem na własne pytanie. –

+1

Czy moja odpowiedź jest zbliżona do tego, czego szukałeś, czy też powinienem wyjaśnić jakąkolwiek jej część? – Tommy

Odpowiedz

10

UPDATE R język określa environment jako posiadające ramki. Zwykle myślę o klatkach jako klatek stosu, a nie jako odwzorowanie od nazwy do wartości - ale wtedy jest oczywiście data.frame, który odwzorowuje nazwy kolumn na wektory (a następnie niektóre ...). Myślę, że większość zamieszania wynika z faktu, że oryginalny język S (i wciąż S-Plus) nie miał obiektów środowiskowych, więc wszystkie "ramki" były w zasadzie tym, czym są obiekty środowiskowe, z tym wyjątkiem, że mogły istnieć tylko jako część stosu wywołań.

Na przykład w S-Plus dokument dla sys.nframe mówi "sys.nframe zwraca indeks numeryczny bieżącej klatki na liście wszystkich klatek." ... to brzmi dla mnie bardzo podobnie do ramek stosu ... Więcej informacji o ramkach stosu można znaleźć tutaj: http://en.wikipedia.org/wiki/Call_stack#Structure

Rozszerzyłem niektóre z poniższych wyjaśnień i konsekwentnie używam terminu "ramka stosu" (mam nadzieję).

END UPDATE

bym je wyjaśnić tak:

  1. Środowisko jest obiektem, który mapuje nazwy zmiennych na wartości. Każde mapowanie nazywa się wiązaniem. Wartość może być wartością rzeczywistą lub obietnicą. Środowisko ma środowisko nadrzędne (z wyjątkiem pustego środowiska). Podczas wyszukiwania symbolu w środowisku, którego nie można znaleźć, przeszukiwane są również środowiska nadrzędne.

  2. Obietnica to nieoceniona ekspresja i środowisko, w którym można oceniać wyrażenie. Kiedy ocena jest oceniona, zostaje zastąpiona wartością generowaną.

  3. Zamknięcie jest funkcją i środowiska, że ​​funkcja została zdefiniowana w funkcji takich jak lm musiałby środowiska statystyki nazw i zdefiniowany przez użytkownika funkcji do miałby globalne środowisko. - ale funkcję f zdefiniowane w innej funkcji g miałoby środowisko lokalne dla g jako swoje środowisko.

  4. Ramka stosu (lub rekord aktywacji) reprezentuje wpisy na stosie wywołań. Każda klatka stosu ma lokalne środowisko, w którym funkcja jest wykonywana, i wyrażenie funkcji (tak, że działa sys.call).

  5. Podczas wywołania funkcji tworzone jest środowisko lokalne z ustawionym rodzica na środowisko zamknięcia, argumenty są porównywane z formalnymi argumentami funkcji, a te wiązania są dodawane do środowiska lokalnego (zgodnie z obietnicą). Niezrównanym argumentom formalnym przypisywane są domyślne wartości (obietnice) funkcji (jeśli występują) i oznaczone jako brakujące. W tym środowisku lokalnym i wyrażeniu wywołania tworzona jest ramka stosu. Ramka stosu jest popychana na stos wywołań, a następnie korpus funkcji jest oceniany w tym lokalnym środowisku.

... więc wszystkie symbole w organizmie będzie wyglądał w środowisku lokalnym (formalne argumenty i zmienne lokalne), a jeśli nie znaleziono w środowisku dominującej (co jest środowisko zamknięcie) i rodziców środowisko rodzicielskie i tak dalej, dopóki nie zostanie znalezione.

Należy zwrócić uwagę, że środowisko ramki stosu rodzica to NOT wyszukiwane w tym przypadku. parent.frame, sys.frame funkcje dostaje środowisk na stosie połączeń - czyli środowisko rozmówcy i środowisko rozmówcy dzwoniącego itd ...

# Here match.fun needs to look in the caller's caller's environment to find what "x" is... 
f <- function(FUN) match.fun(FUN)(1:10) 
g <- function() { x=sin; y="x"; f(y) } 
g() # same as sin(1:10) 

# Here we see that the stack frames must also contain the actual call expression 
f <- function(...) sys.call() 
g <- function(...) f(..., x=42) 
g(a=2) # f(..., x = 42) 
+0

Dzięki za odpowiedź. R-lang mówi, że środowisko składa się z ramki (która składa się z powiązań symbol/wartość) i obudowy (środowisko macierzyste?), Która jest nieco inna niż # 1. # 4 jest mylące z powodu różnic między R-langiem a twoją definicją w # 1 oraz tego, jak R-lang opisuje stos wywołań ze słowami takimi jak "ramka oceny", "konteksty" i "środowiska". Nie wiem, czy to są 3 różne rzeczy, czy autor tego akapitu był wolny od terminologii. Twój ostatni akapit jest nieco niejasny. Dzięki jeszcze raz! –

+0

@JoshuaUlrich - zaktualizowałem swoją odpowiedź. Mam nadzieję, że to wyjaśnia rzeczy (jasne jak błoto !?). – Tommy

+0

Ta odpowiedź ma dla mnie wiele sensu. Dzięki! – Iterator

5

Czy adres this extended description by John Fox odpowiada na pytania?

Ma ładne diagramy, ale nie ma kucyków.

Istnieje również opis w Fox & Weisberg book, "An R Companion to Applied Regression" (2011), począwszy od str. 417 lub pkt 8.9.1. Myślę, że powyższy PDF, choć starszy, jest prawdopodobnie tak samo pouczający, jeśli nie bardziej (z powodu schematów). F & W to dobra książka, którą wcześniej podłączyłem a couple, dla other useful stuff. FWIW, nie znalazłem żadnych przydatnych informacji w książce "R in a Nutshell". Nie mam jeszcze książek z Chambers.

Powiązane problemy