2.5 逻辑向量

除了数字以外,科学计算还经常涉及逻辑值,特别是当使用关系运算符(<等)时。许多编程语言都使用布尔逻辑,其中的值可为TRUEFALSE。在R中,情况有点复杂,因为还可能有缺失值NA。有时,这种拥有三种状态的系统被称为troolean逻辑,虽然这可算是一个词源学上的冷笑话,因为“Boolean”中的“Bool”源于George Bool,而与二进制无关。

TRUEFALSE是R中的保留字:你不能创建以它们命名的变量(但可使用它们的小写或大小写混合,如True)。当你启动R时,变量TF已被系统默认定义为TRUEFALSE。虽然这能让你少打点字,但也会造成很大的问题。TF不是保留字,因此用户可以重新定义它们。这意味着你可以在命令行中使用它们的缩写名称,但如果你的代码需要与他人的代码交互(特别是当他们的代码涉及时间、温度或数学函数时),请避免使用这两个缩写。

在R中有三个向量化逻辑运算符:

  • !代表非操作
  • &代表与操作
  • |代表或操作
  1. (x <- 1:10 >= 5)
  2. ## [1] FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE
  3. !x
  4. ## [1] TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE
  5. (y <- 1:10 %% 2 == 0)
  6. ## [1] FALSE TRUE FALSE TRUE FALSE TRUE FALSE TRUE FALSE TRUE
  7. x & y
  8. ## [1] FALSE FALSE FALSE FALSE FALSE TRUE FALSE TRUE FALSE TRUE
  9. x | y
  10. ## [1] FALSE TRUE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE

我们可编出一些真值表来看看它们是如何工作的(请不用管这段代码是否有意义,只需集中精力去理解每个值是如何在真值表中计算出来的):

  1. x <- c(TRUE, FALSE, NA)     #三个逻辑值
  2. xy <- expand.grid(x = x, y = x) #取得x和y的所有组合
  3. within( #在xy内赋值
  4. xy,
  5. {
  6. and <- x & y
  7. or <- x | y
  8. not.y <- !y
  9. not.x <- !x
  10. }
  11. )
  12. ## x y not.x not.y or and
  13. ## 1 TRUE TRUE FALSE FALSE TRUE TRUE
  14. ## 2 FALSE TRUE TRUE FALSE TRUE FALSE
  15. ## 3 NA TRUE NA FALSE TRUE NA
  16. ## 4 TRUE FALSE FALSE TRUE TRUE FALSE
  17. ## 5 FALSE FALSE TRUE TRUE FALSE FALSE
  18. ## 6 NA FALSE NA TRUE NA FALSE
  19. ## 7 TRUE NA FALSE NA TRUE NA
  20. ## 8 FALSE NA TRUE NA NA FALSE
  21. ## 9 NA NA NA NA NA NA

其他两个比较有用的处理逻辑向量的函数是anyall,如果输入向量中至少包含一个TRUE值或包含TRUE值,它们将分别返回为TRUE

  1. none_true <- c(FALSE, FALSE, FALSE)
  2. some_true <- c(FALSE, TRUE, FALSE)
  3. all_true <- c(TRUE, TRUE, TRUE)
  4. any(none_true)
  5. ## [1] FALSE
  6. any(some_true)
  7. ## [1] TRUE
  8. any(all_true)
  9. ## [1] TRUE
  10. all(none_true)
  11. ## [1] FALSE
  12. all(some_true)
  13. ##[1] FALSE
  14. all(all_true)
  15. ## [1] TRUE