我有一個這樣的名單:提取非空元素中的R
x = list(a = 1:4, b = 3:10, c = NULL)
x
#$a
#[1] 1 2 3 4
#
#$b
#[1] 3 4 5 6 7 8 9 10
#
#$c
#NULL
,我想提取不爲空的所有元素。如何才能做到這一點?謝謝。
我有一個這樣的名單:提取非空元素中的R
x = list(a = 1:4, b = 3:10, c = NULL)
x
#$a
#[1] 1 2 3 4
#
#$b
#[1] 3 4 5 6 7 8 9 10
#
#$c
#NULL
,我想提取不爲空的所有元素。如何才能做到這一點?謝謝。
這裏的另一種選擇:
Filter(Negate(is.null), x)
什麼:
x[!unlist(lapply(x, is.null))]
這裏是正在發生的事情的簡要說明。
lapply
告訴我們哪些元素是NULL
R> lapply(x, is.null)
$a
[1] FALSE
$b
[1] FALSE
$c
[1] TRUE
接下來我們對流列表爲載體:
R> unlist(lapply(x, is.null))
a b c
FALSE FALSE TRUE
然後我們切換TRUE
到FALSE
:
R> !unlist(lapply(x, is.null))
a b c
TRUE TRUE FALSE
最後,我們選擇使用普通的符號元素:
x[!unlist(lapply(x, is.null))]
簡單且可能比上面的快,對於列出了以下工作任何非遞歸(在is.recursive
的意義上)值:
example_1_LST <- list(NULL, a=1.0, b=Matrix::Matrix(), c=NULL, d=4L)
example_2_LST <- as.list(unlist(example_1_LST, recursive=FALSE))
str(example_2_LST)
打印:
List of 3
$ a: num 1
$ b:Formal class 'lsyMatrix' [package "Matrix"] with 5 slots
.. [email protected] x : logi NA
.. [email protected] Dim : int [1:2] 1 1
.. [email protected] Dimnames:List of 2
.. .. ..$ : NULL
.. .. ..$ : NULL
.. [email protected] uplo : chr "U"
.. [email protected] factors : list()
$ d: int 4
你不需要用'base ::'和'utils ::'來引用base和utils中的函數。 –
x[!sapply(x,is.null)]
這可以推廣到對列表中的任何邏輯語句,只需在邏輯子爲 「is.null」。
'x [!sapply(x,is.null)]'會更快嗎? – Julius