Como pregunta, ¿hay una secuencia de control en R similar al operador ternario de C ? Si es así, cómo lo usas? ¡Gracias!
175
Como pregunta, ¿hay una secuencia de control en R similar al operador ternario de C ? Si es así, cómo lo usas? ¡Gracias!
ifelse
, o simplemente una forma más compacta?if (x>1) y=2 else y=3
. Escribiry=
una vez tiene cierto atractivo.Respuestas:
Como
if
es funciónR
y devuelve la última evaluación, if-else es equivalente a?:
.El poder de R es la vectorización. La vectorización del operador ternario es
ifelse
:Es broma, puedes definir c-style
?:
:aquí, no necesita preocuparse por los corchetes:
pero necesita paréntesis para la asignación :(
Finalmente, puedes hacer una manera muy similar con c:
Puede deshacerse de los corchetes:
Estos no son para uso diario, pero tal vez sean buenos para aprender algunos aspectos internos del lenguaje R.
fuente
Como todos los demás dijeron, use
ifelse
, pero puede definir operadores para que casi tenga la sintaxis del operador ternario.Realmente funciona si define los operadores sin los
%
signos, por lo que podría tener(Esto funciona porque la precedencia de
:
es menor que?
).Desafortunadamente, eso rompe la ayuda existente y los operadores de secuencia.
fuente
Al igual que una broma, puede redefinir el
?
operador para (casi) trabajar como el operador ternario (ESTO ES UNA MALA IDEA):... Pero debe poner las expresiones entre paréntesis porque la precedencia predeterminada no es como en C.
Solo recuerda restaurar la antigua función de ayuda cuando hayas terminado de jugar:
fuente
Echaría un vistazo al
ifelse
comando. Lo llamaría aún mejor porque también está vectorizado. Un ejemplo con el conjunto de datos de automóviles:fuente
ifelse
con tu ejemplo? ;)Su enlace apunta a una
if
declaración.Si su variable de entrada es un vector, entonces
ifelse
podría ser más adecuado:Para acceder a la página de ayuda
if
, debe incrustar losif
backticks en:La página de ayuda para
ifelse
está en:fuente
print(if (x<2) "Less than" else "Greater than")
No existe explícitamente, pero puede hacer:
o
La diferencia entre los dos es que
condition1
debe haber un vector lógica de longitud 1, mientras quecondition2
debe ser un vector lógico la misma longitud quex
,y
, yz
. El primero devolveráy
oz
(el objeto completo), mientras que el segundo devolverá el elemento correspondiente dey
(condition2==TRUE
) oz
(condition2==FALSE
).Nota también que
ifelse
será más lento queif
/else
sicondition
,y
yz
son todos los vectores con longitud 1.fuente
if
funciona como ifelse no vectorizado si se usa de la siguiente manera:La ventaja de usar esto sobre ifelse es cuando la vectorización está en el camino (es decir, tengo un resultado escalar booleano y de lista / vector como resultado)
fuente