【问题标题】:Using Filter(Negate(is.na), x) on a list results in unexpected behaviour在列表上使用 Filter(Negate(is.na), x) 会导致意外行为
【发布时间】:2018-11-13 08:46:32
【问题描述】:

考虑

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 处理的控制。

我还是不太明白这种行为。

【问题讨论】:

    标签: r


    【解决方案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 无关。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-03
      • 2021-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多