¿Por qué las declaraciones ifelse de R no pueden devolver vectores?
He descubierto que las declaraciones ifelse de R son bastante útiles de vez en cuando. Por ejemplo:
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 elección de diseño que está por encima de mi nivel salarial?
La documentación para ifelse
los estados:
ifelse
devuelve un valor con la misma forma quetest
se rellena con elementos seleccionados deyes
ono
dependiendo de si el elemento detest
esTRUE
oFALSE
.
Dado que está pasando valores de prueba de longitud 1, obtendrá resultados de longitud 1. Si pasa vectores de prueba más largos, obtendrá resultados más largos:
> ifelse(c(TRUE, FALSE), c(1, 2), c(3, 4))
[1] 1 4
So ifelse
está destinado al propósito específico de probar un vector de valores booleanos y devolver un vector de la misma longitud, lleno de elementos tomados del (vector) yes
y no
argumentos.
Es una confusión común, debido al nombre de la función, usar esto cuando en realidad solo quieres una if () {} else {}
construcción normal.
Apuesto a que quieres una if
declaración simple en lugar de ifelse
- en R, if
no es solo una estructura de flujo de control, 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
Tenga en cuenta que puede evitar el problema si asigna el resultado dentro de ifelse
:
ifelse(TRUE, a <- c(1,2), a <- c(3,4))
a
# [1] 1 2
ifelse(FALSE, a <- c(1,2), a <- c(3,4))
a
# [1] 3 4
sí, creo que ifelse() está realmente diseñado para cuando tienes un gran vector de pruebas y quieres asignar cada una a una de dos opciones. Por ejemplo, a menudo hago colores para plot() de esta manera:
plot(x,y, col = ifelse(x>2, 'red', 'blue'))
Si tuviera un vector grande y largo de pruebas pero quisiera pares para las salidas, tal vez podría usar sapply()
or plyr
's llply()
o algo así.