2009-08-26 16 views
76

J'ai trouvé que les instructions ifelse de R étaient très utiles de temps en temps. Par exemple:Pourquoi les instructions ifelse de R ne peuvent-elles pas renvoyer des vecteurs?

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 qui est au-dessus de ma rémunération?

+1

peu de conception étrange pour ifelse compte tenu du fait que simple si fonctionne autrement. – 2sb

+3

ifelse est une fonction vectorisée. Ils devraient être utilisés pour différentes tâches. – marbel

Répondre

60

La documentation de ifelse suit:

ifelse renvoie une valeur ayant la même forme comme test qui est remplie d' éléments choisis parmi une ou l'autre yes ou no selon que l'élément de test est TRUE ou FALSE.

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, vous obtiendrez des résultats plus:

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

Peut-être que ce que vous vouliez vraiment pour le deuxième ensemble d'instructions était 'if (TRUE) c (1,2) sinon c (3,4)'. –

7

ouais, je pense ifelse () est vraiment conçu pour quand vous avez un grand vecteur de tests et que vous voulez faire correspondre chacune des deux options. Par exemple, je fais souvent des couleurs pour complot() de cette façon:

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

Si vous aviez un grand long vecteur de tests mais je voulais paires pour les sorties, vous pouvez utiliser sapply() ou plyr « s llply() ou quelque chose, peut-être .

47

Je parie que vous voulez une simple déclaration if au lieu de ifelse - dans R, if est non seulement une structure de contrôle de flux, il peut retourner une valeur:

> 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

Vous monsieur êtes un épargnant de vie, MERCI – fuadj

+0

@Ken, cela fonctionne pour moi, même si je reçois ce que j'ai besoin d'un avertissement constant '" Avertissement dans if (req (inputval) == "Tous") {: la condition a une longueur> 1 et seul le premier élément sera utilisé "" que dois-je faire pour me débarrasser de cet avertissement? – user5249203

-1

Parfois, l'utilisateur a juste besoin d'un switch déclaration au lieu d'un ifelse. Dans ce cas:

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

(qui est une autre option de syntaxe de la réponse de Ken Williams)