代码之家  ›  专栏  ›  技术社区  ›  Manuel R

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

r
  •  2
  • Manuel R  · 技术社区  · 6 年前

    考虑

    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值当前始终被视为假值;将来可能会增加对NA处理的控制。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Hugh    6 年前

    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 (第0.2.1版)

    第一个示例有效地尝试选择列表中的第一、第三、第四和第五个元素。与此无关 NA .