Ich versuche get
in Serien von Funktionsaufrufen zu verwenden, aber das Nachschlagen der Objektnamen scheint Umgebungen zu überspringen. Zum Beispiel:
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.
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).
Tags und Links r scope environment-variables