regresan - retornar una lista en c++
¿Por qué las declaraciones ifelse de R no pueden devolver vectores? (5)
He encontrado que las declaraciones de 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 opción de diseño que está por encima de mi paygrade?
A veces, el usuario solo necesita una instrucción switch
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 sintaxis de la respuesta de Ken Williams)
Apuesto a que quieres una declaración if
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
La documentación para estados ifelse
:
ifelse
devuelve un valor con la misma forma que latest
que se llena con elementos seleccionados deyes
ono
según si el elemento de latest
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
Así que ifelse
está destinado al propósito específico de probar un vector de 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, utilizar esto cuando en realidad solo desea una construcción if () {} else {}
normal.
Sí, creo que ifelse () está diseñado para cuando tienes un gran vector largo de pruebas y deseas 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 gran vector largo de pruebas pero deseara pares para las salidas, podría usar sapply()
o plyr
'' llply()
o algo así, tal vez.
Tenga en cuenta que puede eludir 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