私はこのようなリストを持っています:
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
そして、私は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))]
x[!sapply(x,is.null)]
これは、 "is.null"のロジックのsubである、リストに関するすべての論理ステートメントに一般化されます。
上記よりも単純で、おそらく高速です。以下は、再帰的でない(_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
.. ..@ x : logi NA
.. ..@ Dim : int [1:2] 1 1
.. ..@ Dimnames:List of 2
.. .. ..$ : NULL
.. .. ..$ : NULL
.. ..@ uplo : chr "U"
.. ..@ factors : list()
$ d: int 4
_