J'ai trouvé les déclarations ifelse de R assez pratiques de temps en temps. Par exemple:
ifelse(TRUE,1,2)
# [1] 1
ifelse(FALSE,1,2)
# [1] 2
Mais je suis quelque peu confus par le comportement suivant.
ifelse(TRUE,c(1,2),c(3,4))
# [1] 1
ifelse(FALSE,c(1,2),c(3,4))
# [1] 3
Est-ce un choix de conception supérieur à mon salaire?
r
if-statement
r-faq
Christophe DuBois
la source
la source
Réponses:
La documentation pour les
ifelse
états:Puisque vous passez des valeurs de test de longueur 1, vous obtenez des résultats de longueur 1. Si vous passez des vecteurs de test plus longs, vous obtiendrez des résultats plus longs:
Ainsi
ifelse
est destiné spécifiquement à tester un vecteur de booléens et à renvoyer un vecteur de même longueur, rempli d'éléments tirés du (vecteur)yes
et d'no
arguments.C'est une confusion courante, à cause du nom de la fonction, d'utiliser ceci quand vraiment vous voulez juste une
if () {} else {}
construction normale à la place.la source
if (TRUE) c(1,2) else c(3,4)
.Je parie que vous voulez une simple
if
déclaration au lieu deifelse
- dans R, ceif
n'est pas seulement une structure de flux de contrôle, elle peut renvoyer une valeur:la source
" Warning in if (req(inputval) == "All") { : the condition has length > 1 and only the first element will be used"
que dois-je faire pour me débarrasser de cet avertissement?req(inputval)
a plus d'éléments. Pour obtenir une valeur unique, les fonctionsany()
ouall()
peuvent être utiles.Notez que vous pouvez contourner le problème si vous affectez le résultat dans le
ifelse
:la source
ifelse()
fonction vectorisée à la place d'un flux de contrôleif ... else ...
pour l'affectation. Si la condition est un seulTRUE
ou uneFALSE
valeur, je préférerais écrirea <- if (TRUE) c(1,2) else c(3,4)
ouif (TRUE) a <- c(1,2) else a <- c(3,4)
ifelse
au lieu deif
...else
dans le cas d'une seule condition peut vraiment être un problème etifelse
peut être préférée dans certains cas à l'intérieur du code (simple supposition ici), je ne peux pas être en désaccord avec vous ;-). Je voulais juste montrer une voie avecifelse
.oui, je pense que ifelse () est vraiment conçu pour lorsque vous avez un grand vecteur de tests et que vous voulez mapper chacun à l'une des deux options. Par exemple, je fais souvent des couleurs pour plot () de cette manière:
Si vous avez eu un grand long vecteur de tests mais je voulais paires pour les sorties, vous pouvez utiliser
sapply()
ouplyr
« sllply()
ou quelque chose, peut-être.la source
Parfois, l'utilisateur a juste besoin d'une
switch
instruction au lieu d'unifelse
. Dans ce cas:(qui est une autre option de syntaxe de la réponse de Ken Williams)
la source
Voici une approche similaire à celle suggérée par Cath, mais elle peut fonctionner avec des vecteurs pré-assignés existants
Il est basé sur l'utilisation de ce qui
get()
suit:la source
utilisez `if`, par exemple
la source
Dans votre cas, l'utilisation de
if_else
fromdplyr
aurait été utile:if_else
est plus stricte queifelse
, et génère une erreur pour votre cas:la source
Trouvé sur chaque goutte :
Peut reproduire le résultat de votre condition pour renvoyer la longueur souhaitée
la source