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
ifes funciónRy 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
ifelsecomando. Lo llamaría aún mejor porque también está vectorizado. Un ejemplo con el conjunto de datos de automóviles:fuente
ifelsecon tu ejemplo? ;)Su enlace apunta a una
ifdeclaración.Si su variable de entrada es un vector, entonces
ifelsepodría ser más adecuado:Para acceder a la página de ayuda
if, debe incrustar losifbackticks en:La página de ayuda para
ifelseestá 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
condition1debe haber un vector lógica de longitud 1, mientras quecondition2debe ser un vector lógico la misma longitud quex,y, yz. El primero devolveráyoz(el objeto completo), mientras que el segundo devolverá el elemento correspondiente dey(condition2==TRUE) oz(condition2==FALSE).Nota también que
ifelseserá más lento queif/elsesicondition,yyzson todos los vectores con longitud 1.fuente
iffunciona 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