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 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 el flujo de control y [es] típicamente 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 longitud 1, como en los casos en que son funciones que devuelven solo booleanos de longitud 1. Desea usar las formas cortas si los vectores son de longitud posiblemente> 1. Entonces, si no está absolutamente seguro, debe verificar primero o usar el formulario corto y luego usar all
y any
reducirlo a la longitud uno para usar en declaraciones de flujo de control, como if
.
Las funciones all
y any
se utilizan 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 usar en ifelse
.
Una diferencia final: el &&
y ||
solo evalúa tantos términos como sea necesario (que parece ser lo que se entiende por cortocircuito). Por ejemplo, aquí hay una comparación usando un valor indefinido a
; si no hiciera un cortocircuito, 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".