Die Werte wahr und falsch werden durch den Typ logical dargestellt.
Er enthält nur die beiden Werte TRUE und FALSE.
TRUE
#> [1] TRUE
FALSE
#> [1] FALSE
typeof(TRUE)
#> [1] "logical"
Es gibt fünf boolesche Operatoren in R.
!TRUE # FALSE (not)
TRUE && FALSE # FALSE (scalar and)
TRUE || FALSE # TRUE (scalar or)
TRUE & FALSE # FALSE (vector and)
TRUE | FALSE # TRUE (vector or)
&& und & sind das boolesche „und".
Sie ergeben TRUE, wenn die Ausdrücke auf beiden Seiten von && TRUE sind.
|| und | sind das boolesche „oder".
Sie ergeben TRUE, wenn ein Ausdruck auf einer der beiden Seiten von || TRUE ist.
Beachte, dass es zwei Gruppen von Und/Oder-Operatoren gibt.
Diese Unterscheidung wird im Konzept vector-filtering wichtig werden, und wahrscheinlich auch klarer.
Die Verwendung von & und | auf einzelnen Werten funktioniert im obigen Beispiel, weil diese als Vektoren der Länge 1 behandelt werden.
Das Verhalten unterscheidet sich geringfügig von dem der Operatoren mit zwei Zeichen, denn nur bei den letzteren wird die Auswertung abgebrochen: Der Wert auf der rechten Seite wird nicht ausgewertet, wenn der linke Wert bereits ausreicht, um das Ergebnis zu bestimmen.
Somit ist TRUE || anything immer TRUE, egal welchen logischen Ausdruck anything darstellt; anything wird also ignoriert.
Wenn du && oder || auf Vektoren (Länge 2 oder mehr) anwendest, wird nur das erste Element im Vergleich verwendet, was ein einzelnes TRUE/FALSE und wahrscheinlich eine Warnmeldung ergibt.
Das ist wahrscheinlich nicht, was du beabsichtigt hast.
! ist das boolesche „nicht".
Es vertauscht TRUE- und FALSE-Werte.
!TRUE
#> [1] FALSE
!FALSE
#> [1] TRUE
Bei längeren und komplizierteren Ausdrücken solltest du runde Klammern verwenden, um deine Absicht klar zu machen.
(TRUE || FALSE) && (FALSE && TRUE)
#> [1] FALSE
TRUE || FALSE && (FALSE && TRUE)
#> [1] TRUE
Für das exklusive Oder (also A ODER B, aber nicht beides) gibt es keinen Infix-Operator. In diesem Fall kannst du die Funktion xor() verwenden.
xor(TRUE, FALSE)
#> [1] TRUE
xor(TRUE, TRUE)
#> [1] FALSE