在列表上使用Filter(Negate(is.na),x)会导致意外行为

时间:2018-11-13 08:46:32

标签: r

考虑

l1 <- list("a", NA, 1:3, NA)
l2 <- list("a", NULL, 1:3, NULL) 

为什么Filter(Negate(is.na), l1)不能正常工作,而Filter(Negate(is.null), l2)却可以正常工作(它返回l2的所有不是NULL的元素)?

?Filter的帮助文件说

  

...请注意,当前可能的NA值始终为false;将来可能会增加对NA处理的控制。

我仍然不太了解这种行为。

1 个答案:

答案 0 :(得分:1)

is.na返回列表中每个元素的向量;您想要anyNA(或者也许如下定义的exactlyNA):

l1 <- list("a", NA, 1:3, NA)
l2 <- list("a", NULL, 1:3, NULL) 
Filter(Negate(is.na), l1)
#> [[1]]
#> [1] "a"
#> 
#> [[2]]
#> [1] 1 2 3
#> 
#> [[3]]
#> [1] NA
#> 
#> [[4]]
#> NULL
Filter(Negate(anyNA), l1)
#> [[1]]
#> [1] "a"
#> 
#> [[2]]
#> [1] 1 2 3
exactlyNA <- function(x) identical(x, NA)
Filter(Negate(exactlyNA), l1)
#> [[1]]
#> [1] "a"
#> 
#> [[2]]
#> [1] 1 2 3

reprex package(v0.2.1)于2018-11-13创建

您的第一个示例有效地尝试选择列表中的第1、3、4和5个元素。与NA无关。