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 segundo no.

De acuerdo con el texto de ayuda, leí la diferencia similar a la diferencia entre un "Y" y "AndAlso" (correspondientemente "O" y "OrElse")... Significado: Que no todas las evaluaciones si no tienen que ser (es decir, A o B o C es siempre verdadera si A es verdadera, así que deje de evaluar si A es true)

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

Author: matt, 2011-07-02

3 answers

Los más cortos están vectorizados, lo que significa que pueden devolver un vector, así: {[15]]}

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

La forma más larga 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 programar control-flow y [es] típicamente preferida en las cláusulas if."

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

Usted debe ser absolutamente seguro de que sus vectores son solo longitud 1, como en los casos en que son funciones que devuelven solo longitud 1 booleanos. Desea utilizar las formas cortas si los vectores son longitud posiblemente > 1. Así que si no está absolutamente seguro, debe verificar primero, o usar la forma corta y luego usar all y any para reducirlo a una longitud para usar en declaraciones de flujo de control, como if.

Las funciones all y any se utilizan a menudo en el resultado de un vectorizados comparación para ver si todas o alguna de las comparaciones son verdaderas, respectivamente. Los resultados de estas funciones seguramente tendrán una 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úan tantos términos como necesitan (que parece ser lo que se entiende por cortocircuito). Por ejemplo, aquí hay una comparación utilizando un undefined value a; if it didn't short-circuit, as & and | don't, it would give an 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, ver sección 8.2.17 en El Infierno R, titulado "y y andand".

 274
Author: Aaron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-25 20:00:03

La respuesta acerca de "cortocircuito" es potencialmente engañosa, pero tiene algo de verdad (ver abajo). En el lenguaje R/S, && y || solo evalúan el primer elemento en el primer argumento. Todos los demás elementos de 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 programa en lugar de construir nuevos vectores.. Los operadores & y | están diseñados para trabajar en vectores, por lo que se aplicará "en paralelo", por así decirlo, a lo largo de la longitud del argumento más largo. Si los vectores no tienen la misma longitud, se realiza el reciclaje del argumento más corto.

Cuando se evalúan los argumentos a && o ||, hay "cortocircuito" en que si alguno de los valores en sucesión de izquierda a derecha son determinantes, entonces 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
 22
Author: 42-,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-09 13:24:38

&& y || son lo que se llama "cortocircuitos". Esto 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 a && 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 ocurre con || cuando el primer operando es true.

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

 17
Author: Theo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-02 19:00:38