2015-09-29 24 views
7

Il mio googling della domanda non ha restituito risultati utili e la documentazione per ?switch non mi dice come spero di ottenere qui la risposta.Come passare un vettore come parametro in un'istruzione switch

dire che ho un vettore:

cases<- c("one","two","three") 

e voglio utilizzare un'istruzione switch con quegli elementi come i parametri per l'istruzione switch:

switch(input,cases) 

Quanto sopra sarà nulla emesso solo se input=1 nel qual caso il risultato sarà:

switch(1,cases) 
# [1] "one" "two" "three" 

Qualsiasi altra para metro non restituirà nulla. L'unico modo per ottenere il comportamento desiderato è che se digito esplicitamente i casi l'istruzione switch in quanto tale:

switch(2,"one","two","three") 
# [1] "two" 

voglio il comportamento dove posso passare un elenco/vettore/qualunque cosa come parametro interruttore () e raggiungere il seguente comportamento:

switch(2,cases) 
# [1] "two" 

risposta

7

la funzione switch prende un'espressione che indica quale numero argomento per selezionare le rimanenti argomenti della funzione. Come si nota, ciò significa che è necessario suddividere il vettore in argomenti separati quando si richiama switch. Si potrebbe ottenere questo convertendo il vostro vettore a un elenco con as.list e poi passando ogni elemento della lista come argomenti separati per switch con do.call:

do.call(switch, c(1, as.list(cases))) 
# [1] "one" 
do.call(switch, c(2, as.list(cases))) 
# [1] "two" 
do.call(switch, c(3, as.list(cases))) 
# [1] "three" 

Io non vedo il vantaggio di fare questo rispetto all'uso di semplice indicizzazione vettore :

cases[1] 
# [1] "one" 
cases[2] 
# [1] "two" 
cases[3] 
# [1] "three" 
Problemi correlati