154 votes

Pourquoi les instructions ifelse de R ne peuvent-elles pas renvoyer de vecteurs?

J'ai trouvé de temps en temps que les déclarations de R, si elles sont si utiles. Par exemple:

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

Mais je suis un 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
 

S'agit-il 1) d'un bug ou 2) d'un choix de conception supérieur à mon niveau de rémunération?

125voto

Nathan Kitchen Points 2729

La documentation pour ifelse indique:

'ifelse' renvoie une valeur de la même forme que 'test' qui est remplie d'éléments sélectionnés entre 'oui' et 'non' 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 réussissez des vecteurs de test plus longs, vous obtiendrez des résultats plus longs:

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

78voto

Ken Williams Points 4686

Je parie que vous voulez une simple déclaration if au lieu de ifelse - en R, if n'est pas simplement une structure de flux de contrôle, elle peut renvoyer 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
 

9voto

Brendan OConnor Points 2956

Oui, je pense que ifelse () est vraiment conçu pour les cas où vous avez un grand vecteur de tests et souhaitez associer chacun à l'une des deux options. Par exemple, je fais souvent des couleurs pour plot () de cette façon:

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

Si vous aviez un long vecteur de tests mais que vous vouliez des paires pour les sorties, vous pourriez utiliser sapply() ou plyr 's llply() ou autre chose, peut-être.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X