Os valores verdadeiro ou falso são representados pelo tipo logical.
Contém apenas dois valores: TRUE e FALSE.
TRUE
#> [1] TRUE
FALSE
#> [1] FALSE
typeof(TRUE)
#> [1] "logical"
Em R existem cinco operadores booleanos.
!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 «e» booleano.
Resultam em TRUE se as expressões em ambos os lados de && forem TRUE.
|| e | são o «ou» booleano.
Resultam em TRUE se uma expressão de qualquer um dos lados de || for TRUE.
Repara que existem dois conjuntos de operadores e/ou.
Esta distinção vai tornar-se importante, e provavelmente mais clara, no conceito vector-filtering.
Usar & e | com valores únicos funciona no exemplo acima, porque estes são tratados como vetores de comprimento 1.
O comportamento é subtilmente diferente do dos operadores de dois carateres, uma vez que só estes últimos fazem «curto-circuito»: o valor à direita não é avaliado se o valor à esquerda for suficiente para determinar o resultado.
Assim, TRUE || anything é sempre TRUE, seja qual for a expressão lógica que anything representa, por isso o anything é ignorado.
Usar && ou || com vetores (de comprimento 2 ou mais) significa que só o primeiro elemento é usado na comparação, produzindo um único TRUE/FALSE e provavelmente uma mensagem de aviso.
Provavelmente não era isto que pretendias.
! é o «não» booleano.
Troca os valores TRUE e FALSE.
!TRUE
#> [1] FALSE
!FALSE
#> [1] TRUE
Para expressões mais longas e mais complicadas, o melhor é usar parênteses para deixar clara a tua intenção.
(TRUE || FALSE) && (FALSE && TRUE)
#> [1] FALSE
TRUE || FALSE && (FALSE && TRUE)
#> [1] TRUE
Não existe um operador infixo para o ou exclusivo (ou seja, A OU B, mas não ambos). Neste caso, podes usar a função xor().
xor(TRUE, FALSE)
#> [1] TRUE
xor(TRUE, TRUE)
#> [1] FALSE