2017-06-16 1 views
0

Ich erstellte eine sehr einfache if ... else-Anweisung in RStudio und ich stieß auf das folgende Problem. Ich wäre sehr dankbar, wenn Sie einige Zeit, um einen Blick auf diese haben, nehmen könnten: -Eine sehr einfache if ... else-Anweisung erzeugt unerwartete Ergebnisse

(A) Codes: -

testing <- function(var1) { 
    if(var1 == "heart attack") { 
     col_no <- 11 
     col_no 
    } else if(var1 == "heart failure") { 
     col_no <- 17 
     col_no 
    } else if(var1 == "pneumonia") { 
     col_no <- 23 
     col_no 
    } else {"error"} 
} 

(B) Ausgabe: -

testing("heart attack") 
# [1] 11 

col_no 
# Error: object 'col_no' not found 

testing("heart failure") 
# [1] 17 

col_no 
# Error: object 'col_no' not found 

testing("pneumonia") 
# [1] 23 

col_no 
# Error: object 'col_no' not found 

Als ich in "testing (" heart failure ")" eingegeben, habe ich erwartet, dass der Wert von col_no 17 statt eines Fehlers ist.

In ähnlicher Weise, als ich "testing (" pneumonia ") eintippte, erwartete ich den Wert von col_no 23 statt eines Fehlers zu sein.

Bitte helfen!

+4

Das Objekt 'col_no 'ist nur lokal für die Funktion' testing() '. Bitte lesen Sie über Scoping in R. Sie müssen die Funktion wie folgt aufrufen: 'col_no <- testing (" heart attack ")' – jogo

+0

Setzen Sie 'col_no << - 11', um das Funktionsobjekt der Benutzerumgebung zuzuordnen. –

+0

@AdamQuek nein tue das nicht, ordne einfach das Ergebnis zu: 'col_no <- testing (...)' – Cath

Antwort

-3

Da Sie eine Funktion (Testen) definiert haben, ist die Variable col_no nur innerhalb dieser Funktion und nicht in der globalen Umgebung verfügbar. Versuchen Sie stattdessen, dann wird die Variable auch in der globalen Umgebung definiert:

testing <- function(var1) { 
if(var1 == "heart attack") { 
    col_no <<- 11 
    col_no 
} else if(var1 == "heart failure") { 
    col_no <<- 17 
    col_no 
} else if(var1 == "pneumonia") { 
    col_no <<- 23 
    col_no 
} else {"error"} 
} 
+4

ist es ziemlich unklug, globale Zuordnung innerhalb einer Funktion zu tun. Am besten ist es, nur die Rückgabe der Funktion – Cath

+0

Wise oder unwise zuzuweisen ... Abhängig vom Kontext. Das Ersetzen von return() durch << - ist wahrscheinlich eine schlechte Idee. – user3156848

+1

Ich würde gerne ein Beispiel kennen, wo es weise ist, bis dahin halte ich das immer für unklug. Zitieren Bill Venables, Zitat von 'Vermögen (174)': * "Ich wünsche << - war nie erfunden worden, da es eine esoterische und gefährliche Eigenschaft der Sprache ** scheint ** normal und vernünftig. Wenn Sie dumm sein wollen Down R/S in eine Makrosprache, das ist der Operator für Sie. "* – Cath

1

Hier ist eine saubere Syntax switch:

testing <- function(var1){ 
    switch(var1, 
     "heart attack" = 11, 
     "heart failure"= 17, 
     "pneumonia" = 23, 
     "error") 
} 

Aufruf die Funktion:

col_no <- testing("heart attack") 
col_no 
#[1] 11 
col_no <- testing("heart failure") 
col_no 
#[1] 17 
col_no <- testing("pneumonia") 
col_no 
#[1] 23 
col_no <- testing("flue") 
col_no 
#[1] "error" 
+1

... und jetzt müssen Sie die Funktion wie 'col_no <- testing (...)' aufrufen und das ist eine mögliche gute Lösung, ohne den Code von OP zu ändern. – jogo

+0

Das ist großartig! Ich habe eine neue Funktion gelernt. =) –