Az igaz és hamis értékeket a logical típus képviseli.
Ez csak két értéket tartalmaz: TRUE és FALSE.
TRUE
#> [1] TRUE
FALSE
#> [1] FALSE
typeof(TRUE)
#> [1] "logical"
R-ben öt Boolean operátor van.
!TRUE # FALSE (not)
TRUE && FALSE # FALSE (scalar and)
TRUE || FALSE # TRUE (scalar or)
TRUE & FALSE # FALSE (vector and)
TRUE | FALSE # TRUE (vector or)
A && és a & a Boolean „és” művelet.
Az eredményük akkor TRUE, ha a && mindkét oldalán szereplő kifejezés TRUE.
A || és a | a Boolean „vagy” művelet.
Az eredményük akkor TRUE, ha a || valamelyik oldalán szereplő kifejezés TRUE.
Figyeld meg, hogy az és/vagy operátoroknak két csoportja van.
Ez a megkülönböztetés fontossá válik majd, és valószínűleg világosabb is lesz a vector-filtering fogalomban.
Az & és a | használata egyetlen értékeken a fenti példában is működik, mert ezeket 1 hosszúságú vektorként kezeli.
A viselkedés azonban finoman eltér a kétkarakteres operátorokétól, mivel csak az utóbbiak „rövidzárlatosak”: a jobb oldali érték ki sem értékelődik, ha a bal oldali érték már elegendő az eredmény meghatározásához.
Így a TRUE || anything mindig TRUE, függetlenül attól, hogy az anything milyen logikai kifejezést képvisel, ezért az anything figyelmen kívül marad.
Ha a && vagy a || operátort vektorokon (2 vagy több elemű) használod, az összehasonlításban csak az első elem számít, így egyetlen TRUE/FALSE értéket kapsz, valószínűleg egy figyelmeztetéssel együtt.
Ez valószínűleg nem az, amit szerettél volna.
A ! a Boolean „nem” művelet.
Ez felcseréli a TRUE és FALSE értékeket.
!TRUE
#> [1] FALSE
!FALSE
#> [1] TRUE
Hosszabb és bonyolultabb kifejezéseknél a legjobb, ha zárójelekkel teszed egyértelművé a szándékodat.
(TRUE || FALSE) && (FALSE && TRUE)
#> [1] FALSE
TRUE || FALSE && (FALSE && TRUE)
#> [1] TRUE
A kizáró vagy művelethez (azaz A vagy B, de nem mindkettő) nincs infix operátor. Ebben az esetben az xor() függvényt használhatod.
xor(TRUE, FALSE)
#> [1] TRUE
xor(TRUE, TRUE)
#> [1] FALSE