逻辑运算符

与很多编程语言类似,R 可以使用几个运算符进行逻辑运算,如表 5-1 所示。

表 5-1
运算符 描述 示例 结果
& 向量化 AND c(T, T) & c(T, F) TRUE, FALSE
| 向量化 OR c(T, T) | c(T, F) TRUE, TRUE
&& 单变量 AND c(T, T) && c(F, T) FALSE
|| 单变量 OR c(T, T) || c(F, T) TRUE
! 向量化 NOT !c(T, F) FALSE, TRUE
%in% 向量化 IN c(1, 2) %in% c(1, 2, 3, 4) TRUE, FALSE
注意到,在 if 表达式中,&& 和 || 经常被用来执行只需返回单元素逻辑向量的逻辑运
算。但是,当对多元素向量使用 && 时,会有潜在风险,因为它会默默地忽略运算符两侧的向
量中除第 1 个元素以外的其他元素。接下来的例子展示了在条件语句中使用 && 或 || 的
不同之处。
下面这段代码创建了一个 test_direction 函数,用来判别所提供的参数值的单调
性。如果 x、y 和 z 的值是单调递增的,函数返回 1;如果是单调递减的,函数返回−1;否
则,函数返回 0。注意,函数使用 & 来执行向量化的 AND 运算:
test_direction <- function(x, y, z) {
if (x < y & y < z) 1
else if (x > y & y > z) -1
else 0
}
如果提供的参数是标量数字,那么函数可以完美运行:
test_ _direction(1, 2, 3)
## [1] 1
注意,当某个参数有不止一个元素时,& 执行向量化运算,并返回一个多元素向量。
但是,if 只能作用于单值逻辑向量,否则,就会产生警告:
test_ _direction(c(1, 2), c(2, 3), c(3, 4))
## Warning in if (x < y & y < z) 1 else if (x > y & y > z) -1 else 0:
## 条件的长度大于 1,因此只能用其第一元素
## [1] 1
122 第 5 章 基本对象操作
如果我们将两个 & 运算符都替换成 &&,并创建一个新的函数 test_direction2,
如下所示:
test_direction2 <- function(x, y, z) {
if (x < y && y < z) 1
else if (x > y && y > z) -1
else 0
}
这样,上述两个示例可能会有不同的结果。对于标量输入,两个函数的运行结果完全
相同:
test_ _direction2(1, 2, 3)
## [1] 1
但是,对于多元素输入,test_direction2 会默默地忽略每个输入向量的第 2 个元
素,因此不会产生任何警告:
test_ _direction2(c(1, 2), c(2, 3), c(3, 4))
## [1] 1
最后,到底哪种情况正确地使用逻辑运算符,& 还是 && ?这取决于你的需求。你期
待函数怎样处理各种不同的输入情形?如果输入是一个标量值或者多元素向量,你期望什
么?如果你期望利用函数来判别每个输入向量的相同位置的所有元素是否具有单调性,那
么,在某种程度上,这两种用法都不正确,而是需要使用逻辑聚合函数,这将在下一节中介绍。

posted @ 2019-01-22 11:06  NAVYSUMMER  阅读(174)  评论(0编辑  收藏  举报
交流群 编程书籍