¿Por qué las declaraciones ifelse de R no pueden devolver vectores?

Resuelto Christopher DuBois asked hace 54 años • 9 respuestas

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?

Christopher DuBois avatar Jan 01 '70 08:01 Christopher DuBois
Aceptado

La documentación para ifelselos estados:

ifelsedevuelve un valor con la misma forma que testse rellena con elementos seleccionados de yeso nodependiendo de si el elemento de testes TRUEo FALSE.

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 ifelseestá 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) yesy noargumentos.

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.

Nathan Kitchen avatar Aug 26 '2009 16:08 Nathan Kitchen

Apuesto a que quieres una ifdeclaración simple en lugar de ifelse- en R, ifno 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
Ken Williams avatar Nov 18 '2009 17:11 Ken Williams

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
Cath avatar Apr 06 '2018 15:04 Cath

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í.

Brendan OConnor avatar Aug 28 '2009 20:08 Brendan OConnor