Ich bin ein Neuling für R, und ich bin ziemlich verwirrt mit der Verwendung lokaler und globaler Variablen in R.
Ich habe einige Beiträge im Internet gelesen, die besagen, ob ich die Variable in der aktuellen Umgebung verwende =
oder <-
zuweisen werde, und mit der <<-
ich innerhalb einer Funktion auf eine globale Variable zugreifen kann.
Wie ich mich in C ++ erinnere, treten lokale Variablen jedoch immer dann auf, wenn Sie eine Variable in Klammern deklarieren. {}
Ich frage mich also, ob dies für R gleich ist. Oder haben wir nur für Funktionen in R das Konzept lokaler Variablen?
Ich habe ein kleines Experiment durchgeführt, das darauf hindeutet, dass nur Klammern nicht ausreichen. Verstehe ich etwas falsch?
{
x=matrix(1:10,2,5)
}
print(x[2,2])
[1] 4
globalenv(); globalenv() %>% parent.env; globalenv() %>% parent.env %>% parent.env
,…Error: could not find function "%>%"
. Ist das eine andere Form der Zuordnung?require(magrittr)
. Es ist eine Möglichkeit, Funktionen rechts (x | f1 | f2 | f3
) statt links (f3( f2( f1( x ) ) )
) anzuwenden .Antworten:
Innerhalb einer Funktion deklarierte Variablen sind für diese Funktion lokal. Zum Beispiel:
gibt folgenden Fehler aus :
Error: object 'bar' not found
.Wenn Sie
bar
eine globale Variable erstellen möchten , sollten Sie Folgendes tun:In diesem Fall
bar
ist von außerhalb der Funktion zugänglich.Im Gegensatz zu C, C ++ oder vielen anderen Sprachen bestimmen Klammern jedoch nicht den Umfang der Variablen. Zum Beispiel im folgenden Codefragment:
y
bleibt nach derif-else
Aussage zugänglich .Wie Sie bereits sagen, können Sie auch verschachtelte Umgebungen erstellen. Sie können sich diese beiden Links ansehen, um zu verstehen, wie man sie verwendet:
Hier haben Sie ein kleines Beispiel:
quelle
<-
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.
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 desbaz
Wertes von bar bleibt also "in baz - vor << -". Sobald wirbaz
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 erstelltbaz
haben. Dies ist also die erste Kopiebar
, 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:Beide Male,
foo
wenn wir einen Balken innerhalb des Werts drucken, ist dies auch nach dem Aufruf "in foo"baz
. Dies liegt daran, dass wirassign
die Kopie vonbar
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.quelle
Ein bisschen mehr in die gleiche Richtung
druckt "1"
Druckt "20"
quelle