有人能解释一下这里的Or操作符是怎么回事吗?我只是想写一个简单的函数来测试一个元素是否在一个向量中。然而,当我传递两个值,这两个值都不在使用|运算符的矢量,它给了我一个假阳性(见最后一行)。其他一切似乎都如预期的那样…
v <- c(1,2,3)
if (1 %in% v){print('present')}else{print('not present')}
# [1] "present"
if (1&2 %in% v){print('present')}else{print('not present')}
# [1] "present"
if (1|2 %in% v){print('present')}else{print('not present')}
# [1] "present"
if (4 %in% v){print('present')}else{print('not present')}
# [1] "not present"
if (1&4 %in% v){print('present')}else{print('not present')}
# [1] "not present"
if (1|4 %in% v){print('present')}else{print('not present')}
# [1] "present"
if (4&5 %in% v){print('present')}else{print('not present')}
# [1] "not present"
if (4|5 %in% v){print('present')}else{print('not present')}
#[1] "present"
几点说明:
-
当数字对象作为逻辑运算符的参数时,0被视为FALSE,其他数字被视为TRUE。看到了什么?。逻辑。
as.logical(0) ## [1] FALSE as.logical(4) ## [1] TRUE
-
,,和||通常用在if中,因为它们会短路,而&不要这样做。这意味着,如果结果已经可以从左边确定,则不计算右边。(另一个区别是&和|是矢量化的,而&&而||则不是,但由于if中的条件必须是标量,因此在这种情况下不需要向量化。)例如
0 & stop() ## Error: 0 && stop() ## [1] FALSE
-
%in%在&如果没有括号,则为|。看到了吗,表的语法给出了操作的顺序。括号通常用于避免依赖于操作顺序。
例子这是TRUE,因为1在v中:
1 %in% v
## [1] TRUE
它们是相同的,并且是TRUE,因为1被认为是TRUE,而2在v
中1 & 2 %in% v
## [1] TRUE
1 & (2 %in% v)
## [1] TRUE
这些是相同的并且是TRUE,因为1被认为是TRUE。% v中的2%是TRUE还是FALSE并不重要,因为如果其中一个参数为TRUE,则|为TRUE。
1 | 2 %in% v
## [1] TRUE
1 | (2 %in% v)
## [1] TRUE
这是FALSE,因为4不在v
中4 %in% v
## [1] FALSE
这些是相同的,并且是假的,因为4被认为是TRUE,而5不在v和&只有当两边都为真
4 & 5 %in% v
## [1] FALSE
4 & (5 %in% v)
## [1] FALSE
它们是相同的,并且是TRUE,因为4被认为是TRUE,第二个参数无关紧要,因为如果两个参数都为TRUE, |就是TRUE。
4 | 5 %in% v
## [1] TRUE
4 | (5 %in% v)
## [1] TRUE
这些都是TRUE:
1 %in% v && 2 %in% v
## [1] TRUE
(1 %in% v) && (2 %in% v)
## [1] TRUE
all(c(1, 2) %in% v)
## [1] TRUE
1 %in% v || 4 %in% v
## [1] TRUE
(1 %in% v) || (4 %in% v)
## [1] TRUE
any(c(1, 4) %in% v)
## [1] TRUE