I valori vero o falso sono rappresentati dal tipo logical.
Contiene solo due valori: TRUE e FALSE.
TRUE
#> [1] TRUE
FALSE
#> [1] FALSE
typeof(TRUE)
#> [1] "logical"
In R ci sono cinque operatori booleani.
!TRUE # FALSE (not)
TRUE && FALSE # FALSE (scalar and)
TRUE || FALSE # TRUE (scalar or)
TRUE & FALSE # FALSE (vector and)
TRUE | FALSE # TRUE (vector or)
&& e & sono gli operatori booleani «and».
Restituiscono TRUE se le espressioni su entrambi i lati di && sono TRUE.
|| e | sono gli operatori booleani «or».
Restituiscono TRUE se almeno una delle espressioni ai due lati di || è TRUE.
Nota che ci sono due gruppi di operatori «and»/«or».
Questa distinzione diventerà importante, e probabilmente più chiara, nel concetto vector-filtering.
Usare & e | su valori singoli funziona nell'esempio qui sopra, perché questi vengono trattati come vettori di lunghezza 1.
Il comportamento è leggermente diverso da quello degli operatori a due caratteri, perché solo questi ultimi valutano a corto circuito: il valore a destra non viene valutato se quello a sinistra basta a determinare il risultato.
Quindi TRUE || anything è sempre TRUE, qualunque espressione logica rappresenti anything. Perciò anything viene ignorato.
Usare && o || su vettori (di lunghezza 2 o più) fa sì che nel confronto venga usato solo il primo elemento, con il risultato di un singolo TRUE/FALSE e probabilmente un messaggio di avviso.
Probabilmente non è quello che intendevi.
! è l'operatore booleano «not».
Scambia i valori TRUE e FALSE.
!TRUE
#> [1] FALSE
!FALSE
#> [1] TRUE
Per le espressioni più lunghe e complicate, è meglio usare le parentesi per chiarire la tua intenzione.
(TRUE || FALSE) && (FALSE && TRUE)
#> [1] FALSE
TRUE || FALSE && (FALSE && TRUE)
#> [1] TRUE
Non esiste un operatore infisso per l'or esclusivo (cioè A o B, ma non entrambi). In questo caso si può usare la funzione xor().
xor(TRUE, FALSE)
#> [1] TRUE
xor(TRUE, TRUE)
#> [1] FALSE