Od czasu do czasu stwierdziłem, że instrukcje ifelse w języku R są bardzo przydatne. Na przykład:
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 jest to wybór projektu, który przekracza mój abonament?
r
if-statement
r-faq
Christopher DuBois
źródło
źródło
Odpowiedzi:
Dokumentacja dla
ifelse
stanów:Ponieważ przekazujesz wartości testowe o długości 1, otrzymujesz wyniki o długości 1. Jeśli przejdziesz dłuższe wektory testowe, otrzymasz dłuższe wyniki:
Więc
ifelse
jest przeznaczony do konkretnego celu testowania wektora wartości logicznych i zwracania wektora o tej samej długości, wypełnionego elementami pobranymi z (wektor)yes
ino
argumentami.Ze względu na nazwę funkcji częstym zamieszaniem jest używanie tego, gdy naprawdę chcesz
if () {} else {}
zamiast tego zwykłą konstrukcję.źródło
if (TRUE) c(1,2) else c(3,4)
.Założę się, że
if
zamiast tego chcesz prostego oświadczeniaifelse
- w Rif
nie jest tylko strukturą przepływu sterowania, może zwrócić wartość:źródło
" Warning in if (req(inputval) == "All") { : the condition has length > 1 and only the first element will be used"
co mam zrobić, aby pozbyć się tego ostrzeżenia?req(inputval)
ma więcej elementów. Aby uzyskać pojedynczą wartość, przydatne mogą być funkcjeany()
luball()
.Pamiętaj, że możesz obejść problem, jeśli przypiszesz wynik w
ifelse
:źródło
ifelse()
funkcji wektoryzowanej zamiast przepływu kontrolnegoif ... else ...
do przypisania. Jeśli warunek jest pojedynczymTRUE
lubFALSE
wartością, wolałbym napisaća <- if (TRUE) c(1,2) else c(3,4)
lubif (TRUE) a <- c(1,2) else a <- c(3,4)
ifelse
zamiastif
...else
w przypadku pojedynczego warunku może naprawdę stanowić problem iifelse
może być preferowana w niektórych przypadkach wewnątrz kodu (tutaj proste zgadywanie), nie mogę się z tobą nie zgodzić ;-). Chciałem tylko pokazać sposóbifelse
.tak, myślę, że ifelse () jest naprawdę zaprojektowana, gdy masz duży, długi wektor testów i chcesz odwzorować każdy z nich na jedną z dwóch opcji. Na przykład często robię kolory dla plot () w ten sposób:
Gdybyś miał duży, długi wektor testów, ale chciałbyś uzyskać pary dla wyników, mógłbyś użyć
sapply()
lubplyr
'sllply()
lub czegoś takiego.źródło
Czasami użytkownik potrzebuje po prostu
switch
oświadczenia zamiast plikuifelse
. W tym wypadku:(co jest kolejną opcją składni odpowiedzi Kena Williamsa)
źródło
Oto podejście podobne do sugerowanego przez Cath, ale może działać z istniejącymi wstępnie przypisanymi wektorami
Opiera się na użyciu czegoś
get()
podobnego:źródło
użyj „if”, np
źródło
W twoim przypadku pomocne byłoby użycie
if_else
fromdplyr
:if_else
jest bardziej rygorystyczne niżifelse
i generuje błąd dla twojego przypadku:źródło
Znalezione na każdym kroku :
Może odtworzyć wynik twojego stanu, aby zwrócić żądaną długość
źródło