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:
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:
Es gibt mir:
%Vor% Sie können get
verwenden, um nach dem Speichern des Umgebungsnamens auf Ihr Ergebnis zuzugreifen:
erstellt das Objekt my_list
mit my_list$i = 1
und weist es f
zu. Also jetzt f$i = 1
.
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
gibt unbetroffen f$i
Es ', weil Sie <<-
operator verwendet haben, der auf globalen Objekten operiert. Wenn Sie Ihren Code in
my_list
wird nur innerhalb von increment
function erhöht. So, jetzt bekommst du
Lassen Sie mich Ihrem Code eine weitere Zeile hinzufügen, damit wir increment
's Eingeweide sehen können:
Nun können Sie sehen, dass <-
nur innerhalb von increment
operiert, während <<-
außerhalb davon operiert.
Auf der Grundlage von Kommentaren von @Cath zu "value by reference" wurde ich dazu inspiriert.
%Vor%