逻辑函数

在这一节中,我们将关注聚合逻辑向量并寻找真正的元素。
1.聚合逻辑向量
正如我们前面提到的,除了二元逻辑运算符,还有一些逻辑聚合函数也是非常有用的。
最常用的两个逻辑聚合函数是any( )和all( )。只要给定逻辑向量的任何一个(至少一
个)元素是TRUE,函数any( )就返回 TRUE;否则,函数 any( )返回 FALSE。只有给定逻
辑向量的所有元素都是 TRUE,函数 all( )才返回 TRUE;否则,函数 all( ) 返回 FALSE:
x <- c(-2, -3, 2, 3, 1, 0, 0, 1, 2)
any(x > 1)
## [1] TRUE
all(x <= 1)
## [1] FALSE
这两个函数有一个共同点:它们只返回单个 TRUE 或 FALSE 值,不会返回多元素逻辑
向量。因此,要执行上一节中需要满足特定要求的函数,可以在 if 条件语句中同时使用
函数 all( )和 & :
test_all_direction <- function(x, y, z) {
if (all(x < y & y < z)) 1
else if (all(x > y & y > z)) -1
else 0
}
对于标量输入,test_all_direction( )的处理方式与 test_direction( )和
test_direction2( )完全相同:
test_ _all_ _direction(1, 2, 3)
## [1] 1
对于向量输入,函数会检查 c(1, 2, 3)和 c(2, 3, 4)是否具有(相同的)单调性:
test_ _all_ _direction(c(1, 2), c(2, 3), c(3, 4))
## [1] 1
下述代码展示了一个反例,对应向量的第 2 个位置的元素,也就是 c(2, 4, 4)不具
有单调性:
test_ _all_ _direction(c(1, 2), c(2, 4), c(3, 4))
## [1] 0
函数的返回值是有意义的,因为它意味着函数正确执行了测试 3 个输入向量相同位置
的所有元素是否具有单调性的要求。
函数有几种可能的变形,不再使用 any( )或者 &&。你可以尝试理解以下几种函数
的潜在需求(这些函数想做什么呢?):
test_any_direction <- function(x, y, z) {
if (any(x < y & y < z)) 1
else if (any(x > y & y > z)) -1
else 0
}
test_all_direction2 <- function(x, y, z) {
if (all(x < y) && all(y < z)) 1
else if (all(x > y) && all(y > z)) -1
else 0
}
test_any_direction2 <- function(x, y, z) {
if (any(x < y) && any(y < z)) 1
else if (any(x > y) && any(y > z)) -1
else 0
}
2.询问哪个元素为真
前面介绍的逻辑运算符通常返回一个反映某个条件是 TRUE 或 FALSE 的逻辑向量,但
有时需要明确到底哪些元素满足条件。which( ) 函数返回逻辑向量中元素 TRUE 的位置
(或索引):
x
## [1] -2 -3 2 3 1 0 0 1 2
abs(x) >= 1.5
## [1] TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE TRUE
which(abs(x) >= 1.5)
## [1] 1 2 3 4 9
我们仔细看看发生了什么:首先,abs(x)>=1.5 被执行,并返回一个逻辑向量;然
后,which( )函数返回这个逻辑向量中元素 TRUE 的位置。
which( )函数的运算机制与使用逻辑条件筛选向量或列表中的元素非常类似:
x[x >= 1.5]
## [1] 2 3 2
在前面的例子中,我们已经知道 x>=1.5 被执行,并返回一个逻辑向量。然后,根据
这个逻辑向量中元素 TRUE 的位置选择 x 中的对应元素。
此外,还有一种特殊情况,我们甚至可以使用所有元素都是 FALSE 的逻辑向量。因为
该逻辑向量只包含 FALSE,所以 x 中的任何元素都不会被挑出,并返回一个长度为零的数
值向量:
x[x >= 100]
## numeric(0)

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