Operadores booleanos && y ||

De acuerdo con la definición del lenguaje R , la diferencia entre & y && (correspondientemente | y || ) es que el primero está vectorizado mientras que el último no.

De acuerdo con el texto de ayuda , leí la diferencia similar a la diferencia entre un “Y” y “AndAlso” (correspondientemente “O” y “OrElse”) … lo que significa que no todas las evaluaciones si no tienen que ser ( es decir, A o B o C siempre es verdadero si A es verdadero, por lo tanto, deje de evaluar si A es verdadero)

¿Podría alguien arrojar luz aquí? Además, ¿hay un AndAlso y OrElse en R?

    Los más cortos están vectorizados, lo que significa que pueden devolver un vector, como este:

     ((-2:2) >= 0) & ((-2:2) < = 0) # [1] FALSE FALSE TRUE FALSE FALSE 

    La forma más larga se evalúa de izquierda a derecha examinando solo el primer elemento de cada vector, por lo que lo anterior da

     ((-2:2) >= 0) && ((-2:2) < = 0) # [1] FALSE 

    Como dice la página de ayuda, esto hace que la forma más larga "sea apropiada para progtwigr el flujo de control y [es] generalmente preferida en las cláusulas if".

    Por lo tanto, desea utilizar las formas largas solo cuando esté seguro de que los vectores son de longitud uno.

    Debe estar absolutamente seguro de que sus vectores son solo de longitud 1, como en los casos en que son funciones que devuelven solo la longitud 1 booleanos. Desea usar las formas cortas si los vectores tienen una longitud posiblemente> 1. Entonces, si no está del todo seguro, primero debe verificar, o usar el formulario corto y luego usar all y any para reducirlo a la longitud uno para usarlo en las instrucciones de control de flujo, por ejemplo.

    Las funciones all y any se usan a menudo en el resultado de una comparación vectorizada para ver si todas o alguna de las comparaciones son verdaderas, respectivamente. Los resultados de estas funciones seguramente serán de longitud 1, por lo que son apropiados para su uso en cláusulas if, mientras que los resultados de la comparación vectorizada no lo son. (Aunque esos resultados serían apropiados para su uso en ifelse .

    Una diferencia final: el && y || solo evalúe tantos términos como lo necesite (lo que parece ser lo que se entiende por cortocircuito). Por ejemplo, aquí hay una comparación que utiliza un valor indefinido a ; si no se cortocircuitó, como & y | no, daría un error.

     a # Error: object 'a' not found TRUE || a # [1] TRUE FALSE && a # [1] FALSE TRUE | a # Error: object 'a' not found FALSE & a # Error: object 'a' not found 

    Finalmente, vea la sección 8.2.17 en The R Inferno , titulada "and and andand".

    La respuesta sobre “cortocircuito” es potencialmente engañosa, pero tiene algo de verdad (ver más abajo). En el lenguaje R / S, && y || solo evalúa el primer elemento en el primer argumento. Todos los demás elementos en un vector o lista se ignoran independientemente del valor de los primeros. Esos operadores están diseñados para trabajar con la construcción if (cond) {} else{} y para dirigir el control del progtwig en lugar de construir nuevos vectores. El & y el | los operadores están diseñados para trabajar con vectores, por lo que se aplicarán “en paralelo”, por así decirlo, a lo largo del argumento más largo. Si los vectores no tienen la misma longitud, entonces se recicla el argumento más corto.

    Cuando los argumentos a && o || se evalúan, hay un “cortocircuito” en el sentido de que si alguno de los valores en sucesión de izquierda a derecha es determinante, las evaluaciones cesan y se devuelve el valor final.

     > if( print(1) ) {print(2)} else {print(3)} [1] 1 [1] 2 > if(FALSE && print(1) ) {print(2)} else {print(3)} # `print(1)` not evaluated [1] 3 > if(TRUE && print(1) ) {print(2)} else {print(3)} [1] 1 [1] 2 > if(TRUE && !print(1) ) {print(2)} else {print(3)} [1] 1 [1] 3 > if(FALSE && !print(1) ) {print(2)} else {print(3)} [1] 3 

    && y || son lo que se llama “cortocircuito”. Eso significa que no evaluarán el segundo operando si el primer operando es suficiente para determinar el valor de la expresión.

    Por ejemplo, si el primer operando para && es falso, entonces no tiene sentido evaluar el segundo operando, ya que no puede cambiar el valor de la expresión ( false && true y false && false son ambos falsos). Lo mismo vale para || cuando el primer operando es verdadero

    Puedes leer más sobre esto aquí: http://en.wikipedia.org/wiki/Short-circuit_evaluation. De la tabla en esa página puedes ver que && es equivalente a AndAlso en VB.NET, que supongo que te refieres a .