2017-12-12 1 views
2

Ich möchte switch verwenden, um eine Zeichenfolge zu erhalten, aber die Werte, die der auszuwertende Ausdruck annehmen kann, sind 0:20. Im Idealfall würde ich so etwas wieSwitch-Anweisung mit Nullindexierung

switch(val, 
     0 = "output0", 
     1 = "output1", 
     2 = "output2", 
     . 
     . 
     . 
     20 = "output20") 

will Aber das funktioniert nicht, weil val ein numerischer Wert ist. Ich könnte dies nur mit if Anweisungen tun, aber ich würde lieber die switch Syntax verwenden, wie ich gelesen habe, dass es schneller ist und auch ist es kompakter. Gibt es eine Funktion, die tun kann, was ich will, oder gibt es eine Möglichkeit, switch für meinen Zweck zu verwenden?

Antwort

1

entweder von diesen Versuchen:

val <- "0" # test input 

switch(val, "0" = "output0", "1" = "output1") 
## [1] "output0" 

oder

switch(as.numeric(val) + 1, "output0", "output1") 
## [1] "output0" 
+0

Ihre beiden Lösungen funktionieren. Ich ziehe die erste vor, da ich Schalter mit numerischen Eingaben nicht gerne benutze, weil ich denke, dass ich zählen muss, um herauszufinden, was für eine Eingabe das Beste ist (ich dachte eigentlich an die zweite, bevor ich die Frage stelle) . Danke vielmals! –

+0

Und whoops, die erste Lösung funktioniert nur, wenn ich zuerst die Eingabe in Zeichen umwandeln. Für meine Eingabe, die generisch einen numerischen Wert von "1: 20" hat, muss ich also "switch (as.character (val)," 0 "=" output0 "," 1 "=" output1 ")' ' damit es mir den Output gibt, den ich will. –

+1

Die Frage besagt ausdrücklich, dass "val ein Zeichenwert ist". –

1
library(dplyr) 

val <- 2 

case_when(
    val == 0 ~ "output0", 
    val == 1 ~ "output1", 
    val == 2 ~ "output2", 
    val == 20 ~ "output20", 
    TRUE ~ NA_character_ 
) 
## [[1]] "output2" 

ich oft eine

OTHERWISE <- TRUE 

machen und dann verwenden, da es besser liest.

+0

Danke! Das ist eine großartige Funktion, von der ich noch nie zuvor gehört hatte. Aber für mich persönlich (und das gilt natürlich nicht für andere mit dem gleichen Problem), habe ich beschlossen, 'dplyr' im Moment nicht zu verwenden, da es das Projekt, an dem ich arbeite, durchbrochen hat (Ich habe tatsächlich eine Frage dazu gestellt und ich weiß, wie ich das reparieren kann, aber ich weiß nicht, warum es kaputt ist, also berühre ich es erst, wenn ich das herausgefunden habe. –

+1

Es kann ohne eine 'library (dplyr) aufgerufen werden' nur pkg Namespace-Präfix es 'dplyr :: case_when()'. Was wahrscheinlich "brach" einige Funktion Name wird geprügelt. Ich kann die Zurückhaltung verstehen, sie angesichts dieser Erfahrung zu benutzen. – hrbrmstr

+0

Verdammt, ich habe '' so viel gesehen, aber ich habe nie nachgesehen, wofür es ist. Gut zu wissen. –