Valores verdadeiros ou falsos são representados pelo tipo logical.
Ele contém apenas dois valores: TRUE e FALSE.
TRUE
#> [1] TRUE
FALSE
#> [1] FALSE
typeof(TRUE)
#> [1] "logical"
Existem cinco operadores Boolean em R.
!TRUE # FALSE (not)
TRUE && FALSE # FALSE (scalar and)
TRUE || FALSE # TRUE (scalar or)
TRUE & FALSE # FALSE (vector and)
TRUE | FALSE # TRUE (vector or)
&& e & são o "and" Boolean.
Eles resultam em TRUE se as expressões em ambos os lados de && forem TRUE.
|| e | são o "or" Boolean.
Eles resultam em TRUE se uma expressão em qualquer um dos lados de || for TRUE.
Repare que existem dois conjuntos de operadores "and"/"or".
Essa distinção vai se tornar importante, e provavelmente mais clara, no conceito vector-filtering.
Usar & e | com valores únicos funciona no exemplo acima, porque eles são tratados como vetores de comprimento 1.
O comportamento é sutilmente diferente do dos operadores de dois caracteres, já que apenas estes últimos fazem "curto-circuito": o valor da direita não é avaliado se o valor da esquerda já for suficiente para determinar o resultado.
Assim, TRUE || anything é sempre TRUE, não importa que expressão lógica anything represente, então o anything é ignorado.
Usar && ou || com vetores (de comprimento 2 ou mais) significa que apenas o primeiro elemento é usado na comparação, gerando um único TRUE/FALSE e provavelmente uma mensagem de aviso.
Provavelmente não é o que você pretendia.
! é o "not" Boolean.
Ele troca os valores TRUE e FALSE.
!TRUE
#> [1] FALSE
!FALSE
#> [1] TRUE
Para expressões mais longas e complicadas, o melhor é usar parênteses para deixar sua intenção clara.
(TRUE || FALSE) && (FALSE && TRUE)
#> [1] FALSE
TRUE || FALSE && (FALSE && TRUE)
#> [1] TRUE
Não existe um operador infixo para ou exclusivo (ou seja, A OU B, mas não ambos). Nesse caso, dá para usar a função xor().
xor(TRUE, FALSE)
#> [1] TRUE
xor(TRUE, TRUE)
#> [1] FALSE