2009-08-26 18 views
76

He encontrado que las declaraciones ifelse de R son bastante útiles de vez en cuando. Por ejemplo:¿Por qué las declaraciones ifelse de R no pueden devolver vectores?

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

Pero estoy algo confundido por el siguiente comportamiento.

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

¿Es esta una opción de diseño que está por encima de mi paygrade?

+1

poco extraño diseño para ifelse dado el hecho de que la simple si lo demás funciona. – 2sb

+3

ifelse es una función vectorizada. Deben ser utilizados para diferentes tareas. – marbel

Respuesta

60

La documentación para ifelse establece:

ifelse devuelve un valor con el mismo forma como test que se llena con elementos seleccionados de cualquiera yes o no dependiendo de si el elemento de test es TRUE o FALSE.

Dado que usted está pasando valores de la prueba de longitud 1, que está recibiendo resultados de longitud 1. Si pasa vectores de prueba más largos, que obtendrá resultados más largos:

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

Quizás lo que realmente quería para el segundo conjunto de declaraciones era 'if (TRUE) c (1,2) else c (3,4)'. –

7

sí, creo que ifelse () está diseñado para cuando tienes un gran vector largo de pruebas y quieres asignar cada una a una de dos opciones. Por ejemplo, a menudo hago colores de trama() de esta manera:

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

Si tuviera una larga grande del vector de pruebas, pero quería pares de salidas, se podrían utilizar sapply() o plyr 's llply() o algo, tal vez .

47

apuesto desea una simple afirmación if en lugar de ifelse - en R, if no es sólo una estructura de flujo de control, se puede devolver un valor:

> 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

Usted señor es un salvavidas, GRACIAS – fuadj

+0

@Ken, esto funciona para mí, a pesar de que recibo lo que necesito una advertencia constante '" Advertencia en if (req (inputval) == "Todos") {: la condición tiene una longitud> 1 y solo se usará el primer elemento "' ¿qué debo hacer para eliminar esta advertencia? – user5249203

-1

A veces, el usuario sólo necesita un switch declaración en lugar de ifelse. En ese caso:

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

(que es otra opción de la sintaxis de la respuesta de Ken Williams)

Cuestiones relacionadas