2014-12-03 10 views
6

Jestem nowy w programowaniu R. Nie wiem, czy moglibyśmy użyć instrukcji switch dla obiektów numerycznych.Instrukcja przełącznika nie działa dla obiektów numerycznych

To jest mój kod,

myfunction <- function() { 
    x <- 10 
    switch(x, 
     1={ 
      print("one") 
     }, 
     2={ 
      print("two") 
     }, 
     3={ 
      print("three") 
     }, 
     { 
      print("default")  #Edited one.. 
     } 
    ) 
} 

mam ten błąd,

test.R:4:18: unexpected '=' 
3:   switch(x, 
4:     1= 
        ^

Proszę mi pomóc ten problem.

Odpowiedz

6
myfunction <- function(x) { 
         switch(x, 
           print("one"), 
           print("two"), 
           print("three"))} 

myfunction(1) 
## [1] "one" 

Edit: Jak wspomniano w komentarzach, metoda ta nie jest ocena wartości, które są wpisane, a wykorzystuje je jako wskaźnik. Działa to w twoim przypadku, ale nie zadziała, jeśli instrukcje zostaną zmienione (zobacz odpowiedź @ Josha dla lepszego podejścia).

Tak czy inaczej, nie sądzę, że switch jest odpowiednią funkcją do użycia w tym przypadku, ponieważ jest przeznaczona głównie do przełączania między różnymi alternatywami, podczas gdy w twoim przypadku w zasadzie działa się w kółko tą samą funkcją. Dlatego dodanie dodatkowych instrukcji dla każdej alternatywy wydaje się zbyt dużą ilością pracy (jeśli, na przykład, chciałbyś wyświetlić 20 różnych liczb, musisz napisać 20 różnych instrukcji).

Zamiast tego można spróbować pakiet english który pozwoli na wyświetlanie jak wiele liczb, jak można określić w rachunku ifelse

library(english) 
myfunction2 <- function(x) { 
       ifelse(x %in% 1:3, 
         as.character(as.english(x)), 
         "default")} 
myfunction2(1) 
## [1] "one" 
myfunction2(4) 
## [1] "default" 

Alternatywnie, można również unikać switch (choć niekoniecznie zalecane) za pomocą match

myfunction3 <- function(x) { 
    df <- data.frame(A = 1:3, B = c("one", "two", "three"), stringsAsFactors = FALSE) 
     ifelse(x %in% 1:3, 
      df$B[match(x, df$A)], 
      "default")} 
myfunction3(1) 
## [1] "one" 
myfunction3(4) 
## [1] "default" 
+0

Jeśli nie przeszkadza mi powiedzieć jak dodać domyślną tej instrukcji switch? – Venkatesh

+0

Zamiast "function (x)' wykonaj 'function (x = 1)', na przykład (jeśli chcesz, żeby 1 był twoim domyślnym). Możesz również usunąć wszystkie nazwy i po prostu wstaw 'switch (x, {print (" one ")}, {print (" two ")}, {print (" three ")} )' (bez imiona) jako MrFlick wspomniał –

+0

Myślę, że nie było jasne z moim pytaniem. Przepraszam za to. Chcę podać domyślny przypadek dla mojego przełącznika, jak bym to zrobił? – Venkatesh

2

proponuję czytać stronę ?switch pomocy. Wydaje się to dość dobrze opisane. Nazwy w R nigdy nie mogą być numeryczne, tzn. C (1 = 5) jest niedozwolone, ani nie jest f (1 = 5, 2 = 5). Jeśli naprawdę mają 1,2 lub 3, a chcesz tylko

switch(x, 
    {print("one")}, 
    {print("two")}, 
    {print("three")} 
) 

(pominąć nazwy dla wartości numerycznych)

8

Aby w pełni wykorzystać funkcjonalności switch „s (w szczególności jego zdolności do radzenia sobie arbitralny wartości z ostatecznym "domyślnym" wyrażeniem) i do obsługi liczb innych niż 1,2,3, ..., lepiej byłoby konwertować dowolne dane wejściowe na ciąg znaków.

chciałbym zrobić coś takiego:

myfunction <- function(x) { 
    switch(as.character(x), 
     "1" = print("one"), 
     "2" = print("two"), 
     "3" = print("three"), 
     print("something other than 'one', 'two', or 'three'")) 
} 

myfunction(1) 
# [1] "one" 
myfunction(345) 
# [1] "something other than 'one', 'two', or 'three'"