查看与R版本4.1.1 (RStudio 1.4.1717)不一致的行为:
> !(is.na(c(NA, 4, 56, NA)))
[1] FALSE TRUE TRUE FALSE
> (is.na(c(NA, 4, 56, NA)))
[1] TRUE FALSE FALSE TRUE
> !(is.na(c(NA, 4, 56, NA))) %>% which()
[1] FALSE FALSE
> (is.na(c(NA, 4, 56, NA))) %>% which()
[1] 1 4
在一种情况下,which()很好地识别了向量中TRUE值的索引,在另一种情况下(当使用!时),它不会。有人能解释一下吗,还是我发现了一个bug?
跟踪此类问题的一个好方法是{lobstr}包。它显示了表达式/代码块中每个被调用的函数,以及调用这些函数的顺序/嵌套。
您可以看到,!
运算符被称为AFTER,它被应用到结果是is.na
,因此两个都是true。
lobstr::ast(!(is.na(c(NA, 4, 56, NA))) %>% which())
#> █─`!`
#> └─█─`%>%`
#> ├─█─`(`
#> │ └─█─is.na
#> │ └─█─c
#> │ ├─NA
#> │ ├─4
#> │ ├─56
#> │ └─NA
#> └─█─which
您还可以查看?Syntax
,其中显示了由R计算的操作符优先级。