【问题标题】:R: Recursive function in deeply nested list: Accessing level of hierarchyR:深度嵌套列表中的递归函数:访问层次结构的级别
【发布时间】:2021-04-25 09:35:22
【问题描述】:

出于兴趣和思考练习,我的目标是复制 tree function 从 R 中的 windows 命令行。tree 生成类似的 ASCII 树 到下面的例子(取自 here 并修改)。如果n 是层级,请注意每个文件或 文件夹有(n-1)*3 空格,后跟+---

+---Desktop
+---Documents
    +---Custom Office Templates
    +---Fiddler2
        +---Captures
            +---Requests
            +---Responses
        +---Scripts
+---Favorites
    +---Links

我使用list.files() 来提取文件名(虽然是这个函数 忽略空目录)和递归函数dir_tree() (灵感来自this answer)捕捉 嵌套列表中的层次结构。

library(purrr)
library(stringr)
dirs <- list.files(recursive = TRUE) 

# To create a reproducible example, I create dirs manually
dirs <- c("Desktop",
          "Documents",
          "Documents/Custom Office Templates",
          "Documents/Fiddler2",
          "Documents/Fiddler2/Captures",
          "Documents/Fiddler2/Captures/Requests",
          "Documents/Fiddler2/Captures/Responses",
          "Documents/Fiddler2/Scripts",
          "Documents/Favorites",
          "Documents/Favorites/Links"
)

dir_tree <- function(dirs) {
  first <- map_chr(str_split(dirs,"/"),~.x[1])
  rest  <- map_chr(str_split(dirs,"/"),~paste(.x[-1],collapse = "/"))
  zi    <- nchar(dirs) == 0L 
  myli <- split(rest[!zi], first[!zi])
  map(myli, ~dir_tree(.x))
}

# creates a nested list
dir_nl <- dir_tree(dirs)

str(dir_nl)

## List of 2
##  $ Desktop  : Named list()
##  $ Documents:List of 3
##   ..$ Custom Office Templates: Named list()
##   ..$ Favorites              :List of 1
##   .. ..$ Links: Named list()
##   ..$ Fiddler2               :List of 2
##   .. ..$ Captures:List of 2
##   .. .. ..$ Requests : Named list()
##   .. .. ..$ Responses: Named list()
##   .. ..$ Scripts : Named list()

我现在需要做的就是递归遍历嵌套列表并 打印名称,在其前面加上(n-1)*3 空格和+---。这 我的问题是:我如何检索n,即分层 等级!?

recursive_print <- function(dir_nl){
  imap(dir_nl,function(x,y){
    if(is.list(x)){
      print(paste("+---",y))
      recursive_print(x)
    } 
  })
}


recursive_print(dir_nl) %>% invisible()

## [1] "+--- Desktop"
## [1] "+--- Documents"
## [1] "+--- Custom Office Templates"
## [1] "+--- Favorites"
## [1] "+--- Links"
## [1] "+--- Fiddler2"
## [1] "+--- Captures"
## [1] "+--- Requests"
## [1] "+--- Responses"
## [1] "+--- Scripts"

【问题讨论】:

    标签: r list recursion tree purrr


    【解决方案1】:

    我自己无法解决它,但找到了一个可以为我解决的包。这种方式违背了学习递归函数的目的,但我会把它放在这里以防有人登陆这里。

    library(data.tree)
    
    tree <- FromListSimple(dir_nl)
    
    print(tree)
    
    ##                          levelName
    ## 1  Root                           
    ## 2   ¦--Desktop                    
    ## 3   °--Documents                  
    ## 4       ¦--Custom Office Templates
    ## 5       ¦--Favorites              
    ## 6       ¦   °--Links              
    ## 7       °--Fiddler2               
    ## 8           ¦--Captures           
    ## 9           ¦   ¦--Requests       
    ## 10          ¦   °--Responses      
    ## 11          °--Scripts
    

    为了记录,data.tree 有一种方法可以直接将文件路径字符串解析为树,因此dir_tree() 已过时。

    as.Node(data.frame(paths = dirs),pathName = "paths")
    
    ##                     levelName
    ## 1 Desktop                    
    ## 2  ¦--Custom Office Templates
    ## 3  ¦--Fiddler2               
    ## 4  ¦   ¦--Captures           
    ## 5  ¦   ¦   ¦--Requests       
    ## 6  ¦   ¦   °--Responses      
    ## 7  ¦   °--Scripts            
    ## 8  °--Favorites              
    ## 9      °--Links
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-12
      • 2020-09-04
      • 1970-01-01
      • 2013-11-07
      • 2018-08-21
      • 2019-03-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多