有效地删除列表和所有子列表中的所有NULL值 [英] Efficiently remove all NULL values in a list and all sublists
本文介绍了有效地删除列表和所有子列表中的所有NULL值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
请考虑以下列表:
> l1 <- list(NULL,1,2,list(NULL,3,list(NULL,4)))
> str(l1)
List of 4
$ : NULL
$ : num 1
$ : num 2
$ :List of 3
..$ : NULL
..$ : num 3
..$ :List of 2
.. ..$ : NULL
.. ..$ : num 4
要从第一级删除NULL
值,只需调用
To remove NULL
values from the first level, simply call
l1[vapply(l1,is.null,logical(1L))] <- NULL
现在,我想删除所有级别的所有NULL
值,我想出了以下代码.
Now I want to remove all NULL
values at all levels, I come up with the following code.
list.clean <- function(.data, fun = is.null, recursive = FALSE) {
if(recursive) {
.data <- lapply(.data, function(.item) {
if(is.list(.item)) list.clean(.item, fun, TRUE)
else .item
})
}
.data[vapply(.data,fun,logical(1L))] <- NULL
.data
}
然后打电话
> list.clean(l1, recursive = TRUE)
[[1]]
[1] 1
[[2]]
[1] 2
[[3]]
[[3]][[1]]
[1] 3
[[3]][[2]]
[[3]][[2]][[1]]
[1] 4
虽然目前可以使用,但有没有更好或更快速的方法呢?
Although it works right now, is there a better or faster way to do so?
推荐答案
这可以递归完成:
rmNull <- function(x) {
x <- Filter(Negate(is.null), x)
lapply(x, function(x) if (is.list(x)) rmNull(x) else x)
}
l2 <- rmNull(l1)
给予:
> str(l2)
List of 3
$ : num 1
$ : num 2
$ :List of 2
..$ : num 3
..$ :List of 1
.. ..$ : num 4
这篇关于有效地删除列表和所有子列表中的所有NULL值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文