2.5 逻辑向量
除了数字以外,科学计算还经常涉及逻辑值,特别是当使用关系运算符(<
等)时。许多编程语言都使用布尔逻辑,其中的值可为TRUE
或FALSE
。在R中,情况有点复杂,因为还可能有缺失值NA
。有时,这种拥有三种状态的系统被称为troolean逻辑,虽然这可算是一个词源学上的冷笑话,因为“Boolean”中的“Bool”源于George Bool,而与二进制无关。
TRUE
和FALSE
是R中的保留字:你不能创建以它们命名的变量(但可使用它们的小写或大小写混合,如True
)。当你启动R时,变量T
和F
已被系统默认定义为TRUE
和FALSE
。虽然这能让你少打点字,但也会造成很大的问题。T
和F
不是保留字,因此用户可以重新定义它们。这意味着你可以在命令行中使用它们的缩写名称,但如果你的代码需要与他人的代码交互(特别是当他们的代码涉及时间、温度或数学函数时),请避免使用这两个缩写。
在R中有三个向量化逻辑运算符:
!
代表非操作&
代表与操作|
代表或操作
(x <- 1:10 >= 5)
## [1] FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE
!x
## [1] TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE
(y <- 1:10 %% 2 == 0)
## [1] FALSE TRUE FALSE TRUE FALSE TRUE FALSE TRUE FALSE TRUE
x & y
## [1] FALSE FALSE FALSE FALSE FALSE TRUE FALSE TRUE FALSE TRUE
x | y
## [1] FALSE TRUE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
我们可编出一些真值表来看看它们是如何工作的(请不用管这段代码是否有意义,只需集中精力去理解每个值是如何在真值表中计算出来的):
x <- c(TRUE, FALSE, NA) #三个逻辑值
xy <- expand.grid(x = x, y = x) #取得x和y的所有组合
within( #在xy内赋值
xy,
{
and <- x & y
or <- x | y
not.y <- !y
not.x <- !x
}
)
## x y not.x not.y or and
## 1 TRUE TRUE FALSE FALSE TRUE TRUE
## 2 FALSE TRUE TRUE FALSE TRUE FALSE
## 3 NA TRUE NA FALSE TRUE NA
## 4 TRUE FALSE FALSE TRUE TRUE FALSE
## 5 FALSE FALSE TRUE TRUE FALSE FALSE
## 6 NA FALSE NA TRUE NA FALSE
## 7 TRUE NA FALSE NA TRUE NA
## 8 FALSE NA TRUE NA NA FALSE
## 9 NA NA NA NA NA NA
其他两个比较有用的处理逻辑向量的函数是any
和all
,如果输入向量中至少包含一个TRUE
值或只包含TRUE
值,它们将分别返回为TRUE
:
none_true <- c(FALSE, FALSE, FALSE)
some_true <- c(FALSE, TRUE, FALSE)
all_true <- c(TRUE, TRUE, TRUE)
any(none_true)
## [1] FALSE
any(some_true)
## [1] TRUE
any(all_true)
## [1] TRUE
all(none_true)
## [1] FALSE
all(some_true)
##[1] FALSE
all(all_true)
## [1] TRUE