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

标签 r

假设这个简化的例子:

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/

相关文章:

r - 如何通过循环R下载每年的数据

在 Ubuntu 18.04 上的 mlr R 包中运行随机搜索需要太长时间

r - 如何找到某些变量的总体

r - 通过正则表达式灵活分割字符串

返回向量中最小值的索引?

python - 将 100 个带标题的 CSV 文件合并为一个文件的最快方法是什么?

r - 从向量中查找文本中的匹配单词

r - 使用 apply family 函数通过对多个其他列进行操作来创建多个数据框列

r - 编写ggplot自定义几何函数

r - 链接选项卡以在 R Shiny 中按行选择显示绘图