取消列出列表而不丢失 NULL

Jan*_*ary 6 r

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

\n\n

这是重新创建的列表:

\n\n
foo <- list(a=1, b=2, c=NULL)\nnames(foo) <- c("a", "b", NA)\n
Run Code Online (Sandbox Code Playgroud)\n\n

我想要是一个缺失值中包含 NA 的向量:

\n\n
c(1, 2, NA)\n
Run Code Online (Sandbox Code Playgroud)\n\n

然而,简单的unlist()\xe2\x80\x93 不起作用,NULL 元素消失。我尝试了以下方法:

\n\n
foo <- lapply(foo, function(x) if(is.null(x)) NA else x)\nnames(foo) <- NULL\nunlist(foo)\n
Run Code Online (Sandbox Code Playgroud)\n\n

这有效。然而, foo 相当大(数万个元素),并且上面的代码似乎相当慢。有更好的解决方案吗?

\n

Ron*_*hah 6

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

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


tmf*_*mnk 3

一种选择可能是:

foo[sapply(foo, is.null)] <- NA
unlist(foo, use.names = FALSE)

[1]  1  2 NA
Run Code Online (Sandbox Code Playgroud)