真または偽の値はlogical型で表されます。
値はTRUEとFALSEの2つだけです。
TRUE
#> [1] TRUE
FALSE
#> [1] FALSE
typeof(TRUE)
#> [1] "logical"
Rには5つの真偽値演算子があります。
!TRUE # FALSE (not)
TRUE && FALSE # FALSE (scalar and)
TRUE || FALSE # TRUE (scalar or)
TRUE & FALSE # FALSE (vector and)
TRUE | FALSE # TRUE (vector or)
&&と&は真偽値の「and」です。
&&の両側の式がTRUEであれば、TRUEと評価されます。
||と|は真偽値の「or」です。
||のどちらかの側の式がTRUEであれば、TRUEと評価されます。
and/or演算子には2種類あることに注意しましょう。
この違いは、vector-filteringの概念で重要になり、おそらくよりはっきりしてくるでしょう。
単一の値に対して&と|が上の例で機能するのは、これらが長さ1のベクトルとして扱われるからです。
動作は2文字の演算子とは微妙に異なります。後者だけが「短絡評価」を行うからです。つまり、左側の値だけで結果を決められる場合、右側の値は評価されません。
したがって、TRUE || anythingは、anythingがどのような論理式を表していても常にTRUEになり、anythingは無視されます。
ベクトル(長さ2以上)に対して&&や||を使うと、比較には最初の要素だけが使われ、単一のTRUE/FALSEと、おそらく警告メッセージが得られます。
これはおそらく意図した動作ではないでしょう。
!は真偽値の否定です。
TRUEとFALSEの値を入れ替えます。
!TRUE
#> [1] FALSE
!FALSE
#> [1] TRUE
より長く複雑な式では、意図を明確にするために括弧を使うのが一番です。
(TRUE || FALSE) && (FALSE && TRUE)
#> [1] FALSE
TRUE || FALSE && (FALSE && TRUE)
#> [1] TRUE
排他的論理和(AまたはBのどちらか一方で、両方ではない)のための 中置演算子はありません。この場合はxor()関数を使えます。
xor(TRUE, FALSE)
#> [1] TRUE
xor(TRUE, TRUE)
#> [1] FALSE