首页 > 解决方案 > 在不丢失 NULL 的情况下取消列出列表

问题描述

我有一个将字符向量作为输入并返回不一致结果的函数。如果输入中没有 NA,它将返回一个“已翻译”值的命名向量。如果输入中有 NA,它将返回一个列表。与 NA 对应的列表元素将为 NULL,名称为 NA。

这是一个重新创建的列表:

foo <- list(a=1, b=2, c=NULL)
names(foo) <- c("a", "b", NA)

想要的是一个缺失值中带有 NA 的向量:

c(1, 2, NA)

然而,一个简单的方法unlist()是行不通的——NULL 元素消失了。我尝试了以下方法:

foo <- lapply(foo, function(x) if(is.null(x)) NA else x)
names(foo) <- NULL
unlist(foo)

这行得通。但是, foo 非常大(数万个元素),上面的代码似乎相当慢。有更好的解决方案吗?

标签: r

解决方案


NULL长度为 0,所以我们可以使用它:

foo[lengths(foo) == 0] <- NA
unlist(foo, use.names = FALSE)
#[1]  1  2 NA

推荐阅读