在 R 中展平动态列表

Flattening a dynamic list in R

我有两个列表如下-

XY01 = list(
  "A" = LETTERS[1:5],
  "B" = LETTERS[6:10],
  "C" = list(
    "ZZ1" = LETTERS[1],
    "ZZ2" = LETTERS[2],
    "ZZ3" = LETTERS[3]
  )
)

XY02 = list(
  "A" = LETTERS[1:5],
  "B" = LETTERS[6:10],
  "C" = list(
    "Q1" = list(
      "ZZ1" = LETTERS[1],
      "ZZ2" = LETTERS[2],
      "ZZ3" = LETTERS[3]
    ),
    "Q2" = list(
      "ZZ1" = LETTERS[4],
      "ZZ2" = LETTERS[5],
      "ZZ3" = LETTERS[6]
    )
  )
)

我想使用相同的代码将这两个列表展平,因为远程服务器可以随机发送这些列表中的任何一个 - 展平列表 XY01 后的期望输出,我在 运行 之后得到以下代码 -

library(data.table)
rbindlist(list(XY02$C), fill = T)
   ZZ1 ZZ2 ZZ3
1:   A   B   C

我不确定如何使用相同的代码为 XY02(下面给出)获得所需的输出。

Desired output for list XY02
   ZZ1 ZZ2 ZZ3
1:   A   B   C
2:   D   E   F

有人可以提出一个解决方案,使用同一段代码为列表 XY01 和 XY02 获得所需的输出吗?

bind_rows 将使用相同的代码执行此操作

library(dplyr)
bind_rows(XY01$C)
# A tibble: 1 × 3
  ZZ1   ZZ2   ZZ3  
  <chr> <chr> <chr>
1 A     B     C    
bind_rows(XY02$C)
# A tibble: 2 × 3
  ZZ1   ZZ2   ZZ3  
  <chr> <chr> <chr>
1 A     B     C    
2 D     E     F    

如果我们需要使用 rbindlist,请不要在 'XY02'

中再次将其包装在 list
library(data.table)
rbindlist(XY02$C)
   ZZ1 ZZ2 ZZ3
1:   A   B   C
2:   D   E   F

而对于第一种情况,将其包装在 list

rbindlist(list(XY01$C))
   ZZ1 ZZ2 ZZ3
1:   A   B   C

如果我们想检查它是否是一个列表,用if/else

创建一个函数
f1 <- function(x) {
     if(!any(sapply(x, is.list))) {
           x <- list(x)
       }
      rbindlist(x)
}

-测试

> f1(XY01$C)
   ZZ1 ZZ2 ZZ3
1:   A   B   C
> f1(XY02$C)
   ZZ1 ZZ2 ZZ3
1:   A   B   C
2:   D   E   F