R中is.na()取反后结合which()返回结果不一致问题咨询
问题原因
这不是R的bug,是运算符优先级导致的执行顺序不符合你的预期:R中管道符%>%的优先级高于逻辑非运算符!,所以你写的代码实际执行顺序和你设想的完全不同。
实际执行逻辑拆解
你写的代码:
!(is.na(c(NA, 4, 56, NA))) %>% which()
并不会先计算!(is.na(...))再传入which(),而是按如下顺序执行:
- 先执行管道关联的调用:
is.na(c(NA, 4, 56, NA)) %>% which(),得到结果c(1,4) - 再对上述结果执行逻辑非运算:
!c(1,4) - R中所有非0数值转换为逻辑值都是
TRUE,因此!c(1,4)的结果就是c(FALSE, FALSE),和你看到的输出完全一致。
正确写法
只需要给需要优先执行的逻辑非部分套上括号,强制优先级即可:
(!is.na(c(NA, 4, 56, NA))) %>% which()
执行后会返回正确的非NA值下标2 3。
内容的提问来源于stack exchange,提问作者Yozef
相关产品推荐
相关产品推荐

