从嵌套列表动态构建路径

Built a path dynamically from a nested List

提问人:Lev 提问时间:4/3/2023 最后编辑:Lev 更新时间:4/3/2023 访问量:65

问:

拥有此嵌套列表:

myList<-list()
myList[[length(myList)+1]]<-list(text="Grandfather01",tabName='tabnameGrandfather01')
myList[[length(myList)+1]]<-list(text="Grandfather02",
                                 list(text="Father02_01"
                                      ,list(text='Child02_01_01',tabName='tabNameChild02_01_01')
                                      ,list(text='Child02_01_02',tabName='tabNameChild02_01_02')
                                 )
                                )
myList[[length(myList)+1]]<-list(text="Grandfather03",
                                 list(text='Father03_01',tabName='tabNameFather03_01')
                              )

myList[[length(myList)+1]]<-list(text="Grandfather04"
                                 ,list(text="Father04_01"
                                       ,list(text='Child04_01_01'
                                             ,list(text='SuperChild04_01_01_01',tabName='tabNameSuperChild04_01_01_01')
                                             ,list(text='SuperChild04_01_01_02',tabName='tabNameSuperChild04_01_01_02')
                                       )      
                                 )
                                 ,list(text='Father05_01',tabName='tabNameFather05_01')
                              )

我需要建立一个路径列表,例如:

第一个元素包含:

/tabnameGrandfather01

第二个元素包含:

Grandfather02/Father02_01/tabNameChild02_01_01
Grandfather02/Father02_01/tabNameChild02_01_02

第三个元素包含:

Grandfather03/tabNameFather03_01

最后一个包含:

Grandfather04/Father04_01/Child04_01_01/tabNameSuperChild04_01_01_01
Grandfather04/Father04_01/Child04_01_01/tabNameSuperChild04_01_01_02
Grandfather04/tabNameFather05_01

任何使用递归函数的想法?

r 递归 嵌套列表

评论

2赞 Mikael Jagan 4/3/2023
您想要的输出似乎不一致......第一个元素不应该是吗?最后一个元素中的最后一个路径不应该是吗?tabnameGrandfather01Grandfather04/tabNameFather05_01
0赞 M-- 4/3/2023
除了 Mikaels 的评论之外,我的问题是你是如何得出这份名单的?您是否尝试解析 JSON 文件或 html 页面?
0赞 Lev 4/3/2023
对不起,我的错。它已经修复。

答:

2赞 Mikael Jagan 4/3/2023 #1

您可以尝试以下递归函数:

collapse <- function(x, root = NULL) {
    path <-
        if (length(x) == 2L && identical(names(x), c("text", "tabName")))
            x[[2L]]
        else unlist(lapply(x[-1L], sys.function(), x[[1L]]), FALSE, FALSE)
    if (is.null(root)) path else file.path(root, path)
}

lapply(myList, collapse)
[[1]]
[1] "tabnameGrandfather01"

[[2]]
[1] "Grandfather02/Father02_01/tabNameChild02_01_01"
[2] "Grandfather02/Father02_01/tabNameChild02_01_02"

[[3]]
[1] "Grandfather03/tabNameFather03_01"

[[4]]
[1] "Grandfather04/Father04_01/Child04_01_01/tabNameSuperChild04_01_01_01"
[2] "Grandfather04/Father04_01/Child04_01_01/tabNameSuperChild04_01_01_02"
[3] "Grandfather04/tabNameFather05_01"