将深度嵌套的文件保存到具有特定文件名的特定目录

Saving deeply nested files to specific directories with specific filenames

给定一个 3 级嵌套列表:

mylist <- list("1000"=list("cars"=list("fast"=mtcars[1:10,], "slow"=mtcars[11:15,]), "flower"=iris), "2000"=list("tooth"=ToothGrowth, "air"=airquality, "cars"=list("cruiser"=mtcars[5:12,], "fast"=mtcars[1:3,], "mild"=mtcars[9:18,]))) 

(即:mylist00$cars$fast,其中fast是数据帧,cars1000mylist中的嵌套列表)

我想将每个最里面的数据帧(即:fast)保存为 .csv,并将 df 名称作为文件名,即:fast.csv并且 我希望文件保存在以第二级列表命名的目录中,即:~/1000/fast.csv

每个目录都已经存在,所以我不需要创建新的 10002000 目录。

我的直觉是做一个嵌套的 lapplylapply/mapply 组合...但是跟踪不同级别和它们的名称对我来说是一个挑战。我知道 purrriwalk 功能,但我不确定如何在深层嵌套列表中使用它。

我目前的尝试失败了。

lapply(mylist, function(d){
  lapply(names(mylist), function(id){
    lapply(names(d$cars), function(s){
    lapply(d$cars, function(a){
        write.csv(a, paste0(outdir, id, "/", s, ".csv"))})})})})

输出导致单个文件以多个名称保存到所有目录中。即:~/1000/cruiser.csv~/1000/fast.csv~/1000/mild.csv~/2000/cruiser.csv~/2000/fast.csv~/2000/mild.csv ...其中所有文件实际上只是一个 csv mylist00$cars$mild

假设子文件夹在工作目录中:

purrr::iwalk(mylist, function(el, folder){
  purrr::walk(el,
              function(sub_el, folder){
                if(class(sub_el) == "list"){
                  purrr::iwalk(sub_el,
                               function(dat, dat_name, folder){
                                 write.csv(dat,
                                           # below line specifies file path of new file
                                           paste0(folder, "/", dat_name, ".csv"))
                               },
                               folder = folder)
                }
              },
              folder = folder)
})