真或假的值以logical型別表示。
它只包含兩個值:TRUE和FALSE。
TRUE
#> [1] TRUE
FALSE
#> [1] FALSE
typeof(TRUE)
#> [1] "logical"
R 裡有五個布林運算子。
!TRUE # FALSE (not)
TRUE && FALSE # FALSE (scalar and)
TRUE || FALSE # TRUE (scalar or)
TRUE & FALSE # FALSE (vector and)
TRUE | FALSE # TRUE (vector or)
&&和&是布林的「且」。
如果&&兩側的運算式都是TRUE,它們就會求值為TRUE。
||和|是布林的「或」。
如果||任一側的運算式是TRUE,它們就會求值為TRUE。
請注意,這裡有兩組「且」和「或」運算子。
這個區別在 vector-filtering 概念中會顯得重要,而且可能也會更清楚。
在上面的範例中,對單一值使用&和|能夠運作,因為它們會被當成長度為 1 的向量處理。
這個行為和雙字元運算子有細微的差異,因為只有後者會「短路」:如果左邊的值足以決定結果,右邊的值就不會被求值。
因此,無論anything代表什麼布林運算式,TRUE || 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