R语言学习7-逻辑运算
本次课程简要介绍一下R
中的逻辑运算。
R
中有两个逻辑值,也称为布尔值。它们分别是TRUE
和FALSE
。在R
中,可以构造逻辑表达式,其结果为TRUE
或FALSE
。
相等
创建逻辑表达式需要逻辑运算符,逻辑运算符的功能类似于+、-、*、/
等算术运算符。我们首先学习的逻辑运算符是相等运算符,用2
个等号表示:==
。简单尝试下:
> TRUE == TRUE
[1] TRUE
与算术运算符一样,逻辑运算符也能使用括号()
来分组,以改变运算顺序。
> FALSE == (TRUE == FALSE)
[1] TRUE
等式逻辑运算符也可以用来比较数字。
> 6 == 7
[1] FALSE
结果是FALSE
,因为6
比7
小,他们并不相等。
小于、大于
小于运算符<
用来比较左侧的数字是否小于右侧的数字。我们再来用<
比较6
和7
。
> 6 < 7
[1] TRUE
小于运算符还可以和等号一起组成运算符<=
,表示左侧的数字小于或等于右侧的数字。
> 10 <= 10
[1] TRUE
相对应的,也存在大于运算符>
和大于等于运算符>=
。
不相等
上面提到相等的运算符,在R
中还有不相等运算符!=
,用来计算两边的值是否不相等。因为表达式TRUE != FALSE
的结果是TRUE
。与相等运算符一样,不相等运算也可以用于数字。
> 5 != 7
[1] TRUE
取反
为了取反布尔表达式,我们可以用!
(非)操作符。比如! TRUE
(非真)和 FALSE
是相等的。我们可以尝试对5 == 7
的结果取反。
> !(5 == 7)
[1] TRUE
与或
当我们需要检查多个逻辑表达式之间的关系时,就要用到与和或运算符。
与(AND)
让我们先看一下与运算符的工作方式。在R
中,有2
个与运算符,分别是:&
和&&
。这两个运算符的工作方式相似。即如果运算符两边的布尔值均为TRUE
,则返回TRUE
。否则,返回FALSE
。
> FALSE & FALSE
[1] FALSE
我们可以使用&
运算符对向量进行与运算。 与的&&
版本仅比较向量的第一个成员。下面通过一个例子看看两者的区别。
> TRUE & c(TRUE, FALSE, FALSE)
[1] TRUE FALSE FALSE
在这里,又一次看到了向量的循环使用[1]。上述代码等价于c(TRUE, TRUE, TRUE) & c(TRUE, FALSE, FALSE)
。现在我们把&
替换成&&
。
> TRUE && c(TRUE, FALSE, FALSE)
[1] TRUE
在这种情况下,左边的TRUE
只和右边向量的第一个元素TRUE
进行了与操作,剩余的元素都被忽略了。
或(OR)
使用或运算符|
比较两侧的表达式,如果两边都是TRUE
,同样返回TRUE
。但是如果只有一边为TRUE
,结果依然返回TRUE
。只有当两边的结果都是FALSE
时,结果才是FALSE
。
对于上面的例子,我们使用|
和||
分别进行重新比较。
> TRUE | c(TRUE, FALSE, FALSE)
[1] TRUE TRUE TRUE
> TRUE || c(TRUE, FALSE, FALSE)
[1] TRUE
运算顺序
在算术运算符中存在运算顺序,比如乘(*
)的运算优先级就比加(+
)的高。在逻辑运算符中同样有优先级。首先与运算的优先级高于或运算。我们来看一个可能存在歧义的例子。
> 5 > 8 || 6 != 8 && 4 > 3.9
[1] TRUE
这个表达式等价于5 > 8 || (6 != 8 && 4 > 3.9)
,各表达式的布尔值是FALSE || (TRUE && TRUE)
。所以结果是TRUE
。下面还有几个例子。
找出下面表达式中最后结果为真的:
1: 99.99 > 100 || 45 < 7.3 || 4 != 4.0
2: FALSE || TRUE && FALSE
3: TRUE && FALSE || 9 >= 4 && 3 < 6
4: TRUE && 62 < 62 && 44 >= 44
找出下面表达式中最后结果为假的:
1: FALSE || TRUE && 6 != 4 || 9 > 4
2: FALSE && 6 >= 6 || 7 >= 8 || 50 <= 49.5
3: 6 >= -9 && !(6 > 7) && !(!TRUE)
4: !(8 > 4) || 5 == 5.0 && 7.8 >= 7.79
相关函数
现在我们对R
中的逻辑表达式有一点了解了,我们可以使用R
中提供的一些函数来处理逻辑表达式。
isTRUE()
比如isTRUE()
函数,它接受一个参数,如果参数的计算结果为真,则返回TRUE
,反之返回FALSE
。
> isTRUE(6 > 4)
[1] TRUE
identical()
函数identical()
用来比较两个R
对象是否一致,一致时返回TRUE
。
> identical('twins', 'twins')
[1] TRUE
xor()
有一个值得注意的函数是异或函数xor()
。这个函数接受2
个参数,当一个参数为TRUE
,另一个参数为FALSE
时,结果返回TRUE
,其他情况返回FALSE
。
> xor(5 == 6, !FALSE)
[1] TRUE
which()
which()
函数会返回参数表达式中结果为TRUE
的元素索引。
> ints <- sample(10)
> ints
[1] 9 3 1 8 10 4 2 5 6 7
> which(ints > 7)
[1] 1 4 5
在ints > 7
的返回结果中,第1、4、5
位元素是TRUE
。所以最终返回1、4、5
。
any()、all()
像which()
函数一样,函数any()
和all()
都将逻辑向量作为其参数。如果逻辑向量中的一个或多个元素为TRUE
,则any()
函数将返回TRUE
。如果逻辑向量中的每个元素均为TRUE
,则all()
函数将返回TRUE
。
> any (ints < 0)
[1] FALSE
> all(ints > 0)
[1] TRUE
小结
逻辑运算符:
•相等 —— ==
•不相等 —— !==
比较两侧的表达式是否相等•取反 —— !
对布尔值取反•大于、大于等于 —— >
,>=
•小于、小于等于 —— <
,<=
•与 —— &
,&&
两侧都为真,则结果为真。否则结果为假•或 —— |
,||
两侧都为假,则结果为假。有一侧为真,则结果为真。
与运算符的优先级高于或优先级
References
[1]
循环使用: https://yantinger.com/Fswix3mf8/