gpt4 book ai didi

重新列出各种深度的平面列表,保留类

转载 作者:行者123 更新时间:2023-12-04 08:05:03 24 4
gpt4 key购买 nike

假设这个简化的例子:

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)作为 vector不能有多种数据类型。关于数据类型的唯一可用信息是原始的“L”。如果存在自定义数据类型,即如果逻辑值实际上应被视为与逻辑值不同的类型,则以下代码将失败。

library(magrittr)
L1 <- relist(unlist(L), L) %>%
type.convert(as.is = TRUE)
-比较 str结构
 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com