Os mais curtos são vetorizados, o que significa que eles podem retornar um vetor, assim:
((-2:2) >= 0) & ((-2:2) <= 0)
# [1] FALSE FALSE TRUE FALSE FALSE
A forma mais longa avalia da esquerda para a direita, examinando apenas o primeiro elemento de cada vetor;
((-2:2) >= 0) && ((-2:2) <= 0)
# [1] FALSE
Como a página de ajuda diz, isso torna a forma mais longa "apropriada para programar o fluxo de controle e [é] normalmente preferida nas cláusulas if".
Portanto, você deseja usar as formas longas apenas quando tiver certeza de que os vetores têm o comprimento um.
Você deve ter certeza absoluta de que seus vetores têm apenas o comprimento 1, como nos casos em que são funções que retornam apenas o comprimento 1 dos booleanos. Você deseja usar os formulários curtos se os vetores tiverem comprimento> possivelmente 1. Portanto, se você não tiver certeza absoluta, verifique primeiro ou use o formulário curto e, em seguida, use-o all
e any
reduza-o ao comprimento um para uso em instruções de fluxo de controle, como if
.
As funções all
e any
são frequentemente usadas no resultado de uma comparação vetorizada para verificar se todas ou quaisquer comparações são verdadeiras, respectivamente. Os resultados dessas funções certamente têm o comprimento 1, portanto são apropriados para uso nas cláusulas if, enquanto os resultados da comparação vetorizada não são. (Embora esses resultados sejam apropriados para uso no ifelse
.
Uma diferença final: o &&
e ||
avaliar apenas quantos termos forem necessários (o que parece ser o que se entende por curto-circuito). Por exemplo, aqui está uma comparação usando um valor indefinido a
; se não curto-circuito, como &
e |
não, daria um erro.
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
Por fim, consulte a seção 8.2.17 no The R Inferno , intitulada "and and andand".