Zugreifen auf Variablen beim Schließen in R

8

Warum geben f$i und f$get_i() im folgenden Beispiel andere Ergebnisse zurück?

%Vor%     
RobinL 29.06.2017, 10:44
quelle

3 Antworten

4

Die Art, wie Sie programmieren, ist dem funktionalen Paradigma sehr ähnlich. R wird häufiger als Skriptsprache verwendet. Wenn Sie also nicht genau wissen, was Sie tun, ist es eine schlechte Übung, & lt; & lt; zu verwenden oder Funktionen in eine Funktion einzubeziehen.

Sie finden die Erklärung hier im Kapitel über die Funktionsumgebung.

Die Umgebung ist ein Leerzeichen / ein Rahmen, in dem der Code ausgeführt wird. Die Umgebung kann verschachtelt werden, genauso wie Funktionen.

Beim Erstellen einer Funktion haben Sie eine Gehäuseumgebung angehängt, die von environment aufgerufen werden kann. Dies ist die umschließende Umgebung.

Die Funktion wird in einer anderen Umgebung ausgeführt, der Ausführungsumgebung mit dem Neubeginnprinzip. Die Ausführungsumgebung ist eine untergeordnete Umgebung der umgebenden Umgebung.

Zum Beispiel auf meinem Laptop:

%Vor%

f ist ein Objekt in der globalen Umgebung.

Die Funktion increment hat die beigefügte Umgebung 0x0000000022365d58, die Ausführungsumgebung der Funktion factory .

Ich zitiere von Hadley:

  

Wenn Sie eine Funktion in einer anderen Funktion erstellen, wird das umschlossen   Umgebung der Child - Funktion ist die Ausführungsumgebung der   Eltern, und die Ausführungsumgebung ist nicht mehr kurzlebig.

Wenn die Funktion f ausgeführt wird, werden die umgebenden Umgebungen mit dem Objekt my_list darin erstellt.

Dies kann mit dem Befehl ls beurteilt werden:

%Vor%

Der Operator <<- sucht in den Elternumgebungen nach den verwendeten Variablen. In diesem Fall ist das my_list -Objekt dasjenige in der unmittelbaren oberen Umgebung, das die umschließende Umgebung der Funktion ist.

Wenn also ein Inkrement gemacht wird, wird es nur in dieser Umgebung und nicht in der globalen gemacht.

Sie können es sehen, indem Sie die Funktion increment durch Folgendes ersetzen:

%Vor%

Es gibt mir:

%Vor%

Sie können get verwenden, um nach dem Speichern des Umgebungsnamens auf Ihr Ergebnis zuzugreifen:

%Vor%     
YCR 29.06.2017, 12:47
quelle
6
%Vor%

erstellt das Objekt my_list mit my_list$i = 1 und weist es f zu. Also jetzt f$i = 1 .

%Vor%

erhöht nur my_list$i . Es wirkt sich nicht auf f aus.

Jetzt

%Vor%

gibt zurück (zuvor inkrementiert) my_list$i während

%Vor%

gibt unbetroffen f$i

zurück

Es ', weil Sie <<- operator verwendet haben, der auf globalen Objekten operiert. Wenn Sie Ihren Code in

ändern %Vor%

my_list wird nur innerhalb von increment function erhöht. So, jetzt bekommst du

%Vor%

Lassen Sie mich Ihrem Code eine weitere Zeile hinzufügen, damit wir increment 's Eingeweide sehen können:

%Vor%

Nun können Sie sehen, dass <- nur innerhalb von increment operiert, während <<- außerhalb davon operiert.

%Vor%     
Łukasz Deryło 29.06.2017 11:27
quelle
4

Auf der Grundlage von Kommentaren von @Cath zu "value by reference" wurde ich dazu inspiriert.

%Vor%     
Roman Luštrik 29.06.2017 11:54
quelle

Tags und Links