R Umgebungen und Funktionsaufrufe

7

Ich versuche get in Serien von Funktionsaufrufen zu verwenden, aber das Nachschlagen der Objektnamen scheint Umgebungen zu überspringen. Zum Beispiel:

%Vor%

Warum gibt der Aufruf von f1 die foo in der globalen Umgebung zurück und nicht die foo in der Umgebung der aufrufenden Funktion?

Wie sehe ich get in der Umgebung der aufrufenden Funktion? Die Einstellung pos = sys.parent() scheint nicht zu funktionieren.

    
hgcrpd 19.09.2012, 09:44
quelle

2 Antworten

6

Wenn Sie getter definieren, um im übergeordneten Frame zu suchen, funktioniert es:

%Vor%

Dann:

%Vor%     
Andrie 19.09.2012, 09:52
quelle
13

Sie werden durch die feinen Unterschiede zwischen Rahmen und Umgebungen (die noch subtiler sind, da Rahmen Umgebungen sind, oder Umgebungen sind Rahmen) und der Unterschied zwischen lexikalische und dynamische Scoping . Es gibt einige Details auf der Hilfeseite für parent.frame und andere Orte, die über verschiedene verteilt sind Dokumentation.

Um zu versuchen und zu vereinfachen:

Ihre getter -Funktion verfügt über eine eigene Umgebung , in der für diese Funktion lokale Variablen gespeichert sind ( x in diesem Fall). Da R lexikalisch definiert ist, bedeutet dies, dass die Funktionsumgebung eine übergeordnete Umgebung hat, die durch die Definition der Funktion definiert ist. In diesem Fall wäre die globale Umgebung (falls sie innerhalb einer anderen Funktion definiert wäre) die Umgebung Funktion).

Wenn Sie f1 aufrufen und getter aufruft, versucht Getter, die Variable foo zu finden, sie sucht zuerst in ihrer eigenen Umgebung, findet sie dort nicht und sucht dann in ihrer übergeordneten Umgebung nach der globalen env und findet foo mit dem Wert 1.

Ihr Denken entspricht dem dynamischen Scoping, dem die Frames nahe kommen. Wenn f1 aufgerufen wird, erhält es eine eigene Umgebung (in der foo den Wert 2 erhält) und ruft dann die Funktion getter auf. Die Umgebung von foo ist nicht das übergeordnete Element von getter env (lexikalisches Scoping), aber die Umgebung von f1 ist das übergeordnete Bild von getter , da getter von f1 aufgerufen wurde, also zu Wenn Sie in der Umgebung von f1 suchen, müssen Sie der Funktion get mitteilen, dass sie im übergeordneten Frame und nicht in der übergeordneten Umgebung suchen soll.

Die Zusammenfassung davon ist, dass die übergeordnete Umgebung die Umgebung ist, in der eine Funktion definiert wurde (lexikalisches Scoping), der übergeordnete Rahmen ist der Rahmen / die Umgebung, von der die Funktion aufgerufen wurde (simuliertes dynamisches Scoping).

    
Greg Snow 19.09.2012 17:11
quelle

Tags und Links