2009-08-26 10 views
76

Zauważyłem, że odezwa R ifelse jest dość przydatna od czasu do czasu. Na przykład:Dlaczego instrukcje R ifelse R nie mogą zwracać wektorów?

ifelse(TRUE,1,2) 
# [1] 1 
ifelse(FALSE,1,2) 
# [1] 2 

Ale jestem nieco zdezorientowany następującym zachowaniem.

ifelse(TRUE,c(1,2),c(3,4)) 
# [1] 1 
ifelse(FALSE,c(1,2),c(3,4)) 
# [1] 3 

Czy to jest wybór, który jest powyżej mojej ceny?

+1

trochę dziwna konstrukcja ifelse biorąc pod uwagę fakt, że proste, jeśli prace indziej. – 2sb

+3

ifelse jest funkcją wektorową. Powinny być używane do różnych zadań. – marbel

Odpowiedz

60

Dokumentacja ifelse stanowi:

ifelse zwraca wartość z tego samego kształcie jak test która jest wypełniona elementów wybranych z obu yes lub no w zależności od tego, czy element z test jest TRUE lub FALSE.

Ponieważ są przechodzącą wartości testowe o długości 1, otrzymujesz wyniki długości 1. Jeśli zdasz dłuższe wektorów testowych, dostaniesz wyniki dłuższe:

> ifelse(c(TRUE, FALSE), c(1, 2), c(3, 4)) 
[1] 1 4 
+10

Być może tym, czego naprawdę chciałeś dla drugiego zestawu instrukcji, było 'if (TRUE) c (1,2) else c (3,4)'. –

7

Tak, myślę ifelse () jest naprawdę zaprojektowany, gdy masz duży, długi wektor testów i chcesz zmapować każdą z dwóch opcji. Na przykład, często kolory dla fabuły() w następujący sposób:

plot(x,y, col = ifelse(x>2, 'red', 'blue')) 

Gdybyś miał wielkie długi wektor testów, ale chciał pary wyjść, można użyć sapply() lub plyr „s llply() lub coś, być może .

47

założę chcesz prosty if oświadczenie zamiast ifelse - w R, if to nie tylko konstrukcja kontrola przepływu, może zwrócić wartość:

> if(TRUE) c(1,2) else c(3,4) 
[1] 1 2 
> if(FALSE) c(1,2) else c(3,4) 
[1] 3 4 
+0

Ty jesteś ratownikiem, DZIĘKUJĘ – fuadj

+0

@Ken, to działa dla mnie, mimo że dostaję to, czego potrzebuję ciągłe ostrzeżenie '" Ostrzeżenie jeśli (req (inputv) == "All") {: warunek ma długość> 1 i zostanie użyty tylko pierwszy element "" co powinienem zrobić, aby pozbyć się tego ostrzeżenia? – user5249203

-1

Czasami użytkownik potrzebuje tylko switch oświadczenie zamiast ifelse. W tym przypadku:

condition <- TRUE 
switch(2-condition, c(1, 2), c(3, 4)) 
#### [1] 1 2 

(który ma innej opcji składnia odpowiedzi Ken Williams)

Powiązane problemy