Ich fand Rs ifelse-Aussagen von Zeit zu Zeit ziemlich praktisch. Beispielsweise:
ifelse(TRUE,1,2)
# [1] 1
ifelse(FALSE,1,2)
# [1] 2
Aber das folgende Verhalten verwirrt mich etwas.
ifelse(TRUE,c(1,2),c(3,4))
# [1] 1
ifelse(FALSE,c(1,2),c(3,4))
# [1] 3
Ist dies eine Design-Wahl, die über meiner Gehaltsstufe liegt?
r
if-statement
r-faq
Christopher DuBois
quelle
quelle
Antworten:
Die Dokumentation für
ifelse
Staaten:Da Sie Testwerte der Länge 1 bestehen, erhalten Sie Ergebnisse der Länge 1. Wenn Sie längere Testvektoren bestehen, erhalten Sie längere Ergebnisse:
So
ifelse
wird für den speziellen Zweck gedacht einen Vektors von booleans Testen und einen Vektor der gleichen Länge zurückkehrt, gefüllt mit Elementen aus der (Vektor) entnommenyes
undno
Argumenten.Aufgrund des Funktionsnamens ist es eine häufige Verwirrung, dies zu verwenden, wenn Sie wirklich nur eine normale
if () {} else {}
Konstruktion wünschen .quelle
if (TRUE) c(1,2) else c(3,4)
.Ich wette, Sie möchten eine einfache
if
Anweisung anstelle vonifelse
- in Rif
ist dies nicht nur eine Kontrollflussstruktur, sondern kann einen Wert zurückgeben:quelle
" Warning in if (req(inputval) == "All") { : the condition has length > 1 and only the first element will be used"
bekomme, was soll ich tun, um diese Warnung loszuwerden?req(inputval)
mehr Elemente vorhanden sind. Um einen einzelnen Wert zu erhalten, können die Funktionenany()
oderall()
nützlich sein.Beachten Sie, dass Sie das Problem umgehen können, wenn Sie das Ergebnis wie folgt zuweisen
ifelse
:quelle
ifelse()
Funktion anstelle eines Kontrollflussesif ... else ...
für die Zuweisung zu missbrauchen . Wenn die Bedingung eine EinzelpersonTRUE
oder einFALSE
Wert ist, würde ich lieber schreibena <- if (TRUE) c(1,2) else c(3,4)
oderif (TRUE) a <- c(1,2) else a <- c(3,4)
ifelse
anstelle vonif
...else
im Falle einer einzelnen Bedingung wirklich ein Problem seinifelse
kann und in einigen Fällen innerhalb des Codes bevorzugt werden kann (einfache Vermutung hier), kann ich Ihnen nicht widersprechen ;-). Ich wollte nur einen Weg zeigen mitifelse
.Ja, ich denke, ifelse () ist wirklich dafür gedacht, wenn Sie einen großen, langen Testvektor haben und jede einer von zwei Optionen zuordnen möchten. Zum Beispiel mache ich oft Farben für plot () auf folgende Weise:
Wenn Sie einen großen langen Testvektor hatten, aber Paare für Ausgaben wollten, könnten Sie vielleicht
sapply()
oderplyr
'sllply()
oder so etwas verwenden.quelle
Manchmal benötigt der Benutzer nur eine
switch
Anweisung anstelle einerifelse
. In diesem Fall:(Dies ist eine weitere Syntaxoption von Ken Williams 'Antwort.)
quelle
Hier ist ein Ansatz ähnlich dem von Cath vorgeschlagenen, der jedoch mit vorhandenen vorab zugewiesenen Vektoren funktionieren kann
Es basiert auf der Verwendung von
get()
Ähnlichem wie folgt :quelle
benutze `if`, zB
quelle
In Ihrem Fall wäre die Verwendung von
if_else
fromdplyr
hilfreich gewesen:if_else
ist strenger alsifelse
und wirft einen Fehler für Ihren Fall aus:quelle
Gefunden auf everydropr :
Kann das Ergebnis Ihrer Bedingung replizieren, um die gewünschte Länge zurückzugeben
quelle