假设这个简化的例子:
L <- list()
L$Foo <- list()
L$Foo$Bar <- list()
L$Foo$Bar$X <- TRUE
L$Foo$Bar$Y <- "abc"
L$Lorem <- list()
L$Lorem$Ipsum <- list()
L$Lorem$Ipsum$Dolor <- list()
L$Lorem$Ipsum$Dolor$X <- TRUE
L$Lorem$Ipsum$Dolor$Z <- "xyz"
在 this question ,我尝试在取消列出后重新创建任意深度的嵌套列表。一个答案建议使用 unlist()
,然后使用 relist()
。
但是,如果原始类发生变化,此建议不会保留它们。例如,relist(unlist(L), L)
将返回:
$Foo
$Foo$Bar
$Foo$Bar$X
[1] "TRUE"
$Foo$Bar$Y
[1] "abc"
$Lorem
$Lorem$Ipsum
$Lorem$Ipsum$Dolor
$Lorem$Ipsum$Dolor$X
[1] "TRUE"
$Lorem$Ipsum$Dolor$Z
[1] "xyz"
请注意,"TRUE"
和 "FALSE"
是错误的字符,而不是逻辑字符。
现在提供一种解决方案 here 。但是,这个问题的答案不适用于嵌套列表的任何深度级别。例如,按照答案中的建议运行 relist2(flatten(L), L)
返回:
> relist2(flatten(L), L)
$Foo
$Foo$Bar.X
$Foo$Bar.X[[1]]
[1] TRUE
$Foo$Bar.Y
$Foo$Bar.Y[[1]]
[1] "abc"
$Lorem
$Lorem$Ipsum.Dolor
$Lorem$Ipsum.Dolor$X
$Lorem$Ipsum.Dolor$X[[1]]
[1] TRUE
$Lorem$Ipsum.Dolor$Z
$Lorem$Ipsum.Dolor$Z[[1]]
[1] "xyz"
这里,类被保留,但并非所有级别都被重新列出 - 请注意 Ipsum.Dolor
应该被重新列出为 Ipsum$Dolor
。
关于如何解决这个问题有什么想法吗?
最佳答案
我们可以使用type.convert
根据值更改数据类型。 unlist
将数据类型强制为单一数据类型(如果存在字符元素,则很可能是character
),因为向量
不能具有多种数据类型。有关数据类型的唯一可用信息位于原始“L”中。如果存在自定义数据类型,即逻辑值实际上应被视为与逻辑值不同的类型,则以下代码将失败。
library(magrittr)
L1 <- relist(unlist(L), L) %>%
type.convert(as.is = TRUE)
-比较结构
结构
str(L1)
List of 2
$ Foo :List of 1
..$ Bar:List of 2
.. ..$ X: logi TRUE
.. ..$ Y: chr "abc"
$ Lorem:List of 1
..$ Ipsum:List of 1
.. ..$ Dolor:List of 2
.. .. ..$ X: logi TRUE
.. .. ..$ Z: chr "xyz"
> str(L)
List of 2
$ Foo :List of 1
..$ Bar:List of 2
.. ..$ X: logi TRUE
.. ..$ Y: chr "abc"
$ Lorem:List of 1
..$ Ipsum:List of 1
.. ..$ Dolor:List of 2
.. .. ..$ X: logi TRUE
.. .. ..$ Z: chr "xyz"
关于重新列出各种深度的平面列表,保留类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66251237/