真或假的值由 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