或操作符在r中不符合预期

  • 本文关键字:不符合 操作符 r
  • 更新时间 :
  • 英文 :


有人能解释一下这里的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"

几点说明:

  1. 当数字对象作为逻辑运算符的参数时,0被视为FALSE,其他数字被视为TRUE。看到了什么?。逻辑。

    as.logical(0)
    ## [1] FALSE
    as.logical(4)
    ## [1] TRUE
    
  2. ,,和||通常用在if中,因为它们会短路,而&不要这样做。这意味着,如果结果已经可以从左边确定,则不计算右边。(另一个区别是&和|是矢量化的,而&&而||则不是,但由于if中的条件必须是标量,因此在这种情况下不需要向量化。)例如

    0 & stop()
    ## Error: 
    0 && stop()
    ## [1] FALSE
    
  3. %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

最新更新