【发布时间】: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