否定is.na()与which()结合得到不一致的结果



查看与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计算的操作符优先级。

最新更新