<-
erledigt die Zuordnung in der aktuellen Umgebung.
Wenn Sie sich in einer Funktion befinden, erstellt R eine neue Umgebung für Sie. Standardmäßig enthält es alles aus der Umgebung, in der es erstellt wurde, sodass Sie diese Variablen auch verwenden können, aber alles, was Sie neu erstellen, wird nicht in die globale Umgebung geschrieben.
In den meisten Fällen <<-
werden Variablen zugewiesen, die sich bereits in der globalen Umgebung befinden, oder es wird eine Variable in der globalen Umgebung erstellt, selbst wenn Sie sich in einer Funktion befinden. Es ist jedoch nicht ganz so einfach. Es überprüft die übergeordnete Umgebung auf eine Variable mit dem Namen von Interesse. Wenn es in Ihrer übergeordneten Umgebung nicht gefunden wird, geht es zum übergeordneten Element der übergeordneten Umgebung (zum Zeitpunkt der Erstellung der Funktion) und sucht dort. Es geht weiter nach oben in die globale Umgebung. Wenn es in der globalen Umgebung nicht gefunden wird, wird die Variable in der globalen Umgebung zugewiesen.
Dies könnte veranschaulichen, was los ist.
bar <- "global"
foo <- function(){
bar <- "in foo"
baz <- function(){
bar <- "in baz - before <<-"
bar <<- "in baz - after <<-"
print(bar)
}
print(bar)
baz()
print(bar)
}
> bar
[1] "global"
> foo()
[1] "in foo"
[1] "in baz - before <<-"
[1] "in baz - after <<-"
> bar
[1] "global"
Das erste Mal, wenn wir eine Leiste drucken, haben wir noch nicht angerufen, foo
daher sollte sie immer noch global sein - das ist sinnvoll. Das zweite Mal, wenn wir es drucken, ist es innerhalb von, foo
bevor wir es aufrufen, baz
sodass der Wert "in foo" Sinn macht. Im Folgenden sehen wir, was <<-
tatsächlich geschieht. Der nächste gedruckte Wert ist "in baz - vor << -", obwohl die print-Anweisung nach dem steht <<-
. Dies liegt daran , <<-
nicht in der aktuellen Umgebung suchen (es sei denn , Sie in der globalen Umgebung sind in diesem Fall <<-
verhält sich wie <-
). Innerhalb des baz
Wertes von bar bleibt also "in baz - vor << -". Sobald wir baz
die Kopie der Leiste innerhalb von aufrufen, foo
wird sie in "in baz" geändert, aber wie wir sehen können, bar
bleibt die globale unverändert.bar
Das, was innerhalb von definiert ist, foo
befindet sich in der übergeordneten Umgebung, als wir es erstellt baz
haben. Dies ist also die erste Kopie bar
, die <<-
angezeigt wird, und somit die Kopie, der es zugewiesen ist. Es <<-
wird also nicht nur direkt der globalen Umgebung zugewiesen.
<<-
ist schwierig und ich würde es nicht empfehlen, wenn Sie es vermeiden können. Wenn Sie der globalen Umgebung wirklich zuweisen möchten, können Sie die Zuweisungsfunktion verwenden und ihr explizit mitteilen, dass Sie global zuweisen möchten.
Jetzt ändere ich die <<-
zu einer Assign-Anweisung und wir können sehen, welchen Effekt das hat:
bar <- "global"
foo <- function(){
bar <- "in foo"
baz <- function(){
assign("bar", "in baz", envir = .GlobalEnv)
}
print(bar)
baz()
print(bar)
}
bar
#[1] "global"
foo()
#[1] "in foo"
#[1] "in foo"
bar
#[1] "in baz"
Beide Male, foo
wenn wir einen Balken innerhalb des Werts drucken, ist dies auch nach dem Aufruf "in foo" baz
. Dies liegt daran, dass wir assign
die Kopie von bar
inside of foo noch nie in Betracht gezogen haben, weil wir genau gesagt haben, wo wir suchen sollen. Diesmal wurde jedoch der Wert von bar in der globalen Umgebung geändert, da wir ihn dort explizit zugewiesen haben.
Jetzt haben Sie auch nach dem Erstellen lokaler Variablen gefragt, und Sie können dies auch ziemlich einfach tun, ohne eine Funktion zu erstellen ... Wir müssen nur die local
Funktion verwenden.
bar <- "global"
# local will create a new environment for us to play in
local({
bar <- "local"
print(bar)
})
#[1] "local"
bar
#[1] "global"
globalenv(); globalenv() %>% parent.env; globalenv() %>% parent.env %>% parent.env
,…