2016-09-21 5 views
0

Für ein Shiny-Projekt verwende ich globale Variablen. Ich mache ständig den Fehler mit < - wo ich < < - verwenden sollte. Was aber verrückt ist, ist, dass R keinen Fehler auslöst, wenn versucht wird, einer lokalen Variablen zuzuweisen, die nicht existiert, wenn diese Variable in der globalen Umgebung existiert.Fehlender Fehler beim lokalen Zuweisen einer Variablen, die nicht lokal existiert, aber global

Ist das ein Fehler oder gibt es einen Grund, warum die BBB $ BBB Zuweisung hier keinen Fehler wie die ccc $ ccc Zuweisung verursacht?

aaa <- list(aaa="old") 
bbb <- list(bbb="old") 

f = function(x){ 
    aaa$aaa <<- x 
    bbb$bbb <- x 
    ccc$ccc <- x 
} 
f("new") 
#Error in ccc$ccc <- x : object 'ccc' not found 

aaa 
#$aaa 
#[1] "new" 

bbb 
#$bbb 
#[1] "old" 

ccc 
#Error: object 'ccc' not found 

Antwort

2

Dies ist kein Fehler, sondern erwartetes Verhalten.

Die R language definition sagt:

3.4.4 Subset Zuordnung

Zuordnung zu Teilmengen von einer Struktur ist ein Spezialfall eines allgemeinen Mechanismus für komplexe Aufgabe:

x[3:5] <- 13:15 

The Ergebnis dieses Befehls ist, als ob das folgende ausgeführt worden wäre

`*tmp*` <- x 
x <- "[<-"(`*tmp*`, 3:5, value=13:15) 
rm(`*tmp*`) 

Also wird im ersten Schritt eine Kopie der globalen Liste bbb zu einer lokalen Variablen *tmp* gemacht. Dann erfolgt die Teilmengenzuordnung und das Ergebnis wird einer (neuen) lokalen Variablen bbb zugewiesen, die nach der Rückgabe der Funktion verloren geht.

PS: Nebenwirkungen sind schlecht und sollten vermieden werden. Verwenden Sie keine globalen Variablen. Funktionen sollten als Parameter übergeben werden und alle Ausgaben (außer Plots und Dateien) zurückgeben.

+0

Sie sagen also, dass für ccc $ ccc der Fehler von '* temp *' <- x; aber für bbb $ bbb, das ist kein fehler, weil es in der globalen umgebung gefunden wird? – 3D0G

+0

In Shiny, wenn der Benutzer einige Daten auf einer Webseite eingibt, erhalte ich die Kontrolle innerhalb einer Funktion observeEvent() innerhalb einer server() -Funktion. Da ich die Daten speichern möchte, gibt es wirklich keine andere Wahl als sie einem globalen zuzuweisen und dann das globale in eine Datei zu speichern. Wenn das observeEvent() zurückgibt, geht es zurück zum Server() und ich verliere die Kontrolle. Es gibt also keinen Ort, an den ich zurückkehren könnte (the_data). – 3D0G

+0

Ja zum ersten Kommentar. Ich benutze nicht glänzend, aber ich bezweifle, dass es schlechte Programmierpraktiken erfordert. – Roland

Verwandte Themen