He encontrado 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 opción de diseño que está por encima de mi pago?
r
if-statement
r-faq
Christopher DuBois
fuente
fuente
Respuestas:
La documentación de los
ifelse
estados:Dado que pasa valores de prueba de longitud 1, obtiene resultados de longitud 1. Si pasa vectores de prueba más largos, obtendrá resultados más largos:
Así que
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
yno
argumentos.Es una confusión común, debido al nombre de la función, usar esto cuando realmente desea una
if () {} else {}
construcción normal .fuente
if (TRUE) c(1,2) else c(3,4)
.Apuesto a que desea una
if
declaración simple en lugar deifelse
: en R,if
no es solo una estructura de flujo de control, puede devolver un valor:fuente
" Warning in if (req(inputval) == "All") { : the condition has length > 1 and only the first element will be used"
¿qué debo hacer para deshacerme de esta advertencia?req(inputval)
tiene más elementos. Para obtener un solo valor las funcionesany()
oall()
podrían ser útiles.Tenga en cuenta que puede evitar el problema si asigna el resultado dentro de
ifelse
:fuente
ifelse()
función vectorizada en lugar de un flujo de controlif ... else ...
para la asignación. Si la condición es únicaTRUE
oFALSE
valor, preferiría escribira <- if (TRUE) c(1,2) else c(3,4)
oif (TRUE) a <- c(1,2) else a <- c(3,4)
ifelse
lugar deif
...else
en caso de una sola condición realmente puede ser un problema yifelse
puede ser preferible en algunos casos dentro del código (una simple suposición aquí), no puedo estar en desacuerdo con usted ;-). Solo quería mostrar un camino conifelse
.sí, creo que ifelse () está realmente diseñado para cuando tienes un gran vector de pruebas y quieres mapear cada una a una de dos opciones. Por ejemplo, a menudo hago colores para plot () de esta manera:
Si usted tenía una larga grande del vector de pruebas, pero quería pares de salidas, se puede usar
sapply()
oplyr
'sllply()
o algo, tal vez.fuente
A veces, el usuario solo necesita una
switch
declaración en lugar de unifelse
. En ese caso:(que es otra opción de sintaxis de la respuesta de Ken Williams)
fuente
Aquí hay un enfoque similar al sugerido por Cath, pero puede funcionar con vectores preasignados existentes
Se basa en el uso de me
get()
gusta así:fuente
use `si`, por ejemplo
fuente
En su caso, usar
if_else
fromdplyr
habría sido útil:if_else
es más estricto queifelse
, y arroja un error para su caso:fuente
Encontrado en everydropr :
Puede replicar el resultado de su condición para devolver la longitud deseada.
fuente