如何从目录树构建树形图?

wdk*_*nls 15 r dendrogram

给定根绝对目录路径.如何生成其下方所有路径的树状图对象,以便我可以使用R可视化目录树?

假设以下调用返回以下叶节点.

list.files(path, full.names = TRUE, recursive = TRUE)

root/a/some/file.R
root/a/another/file.R
root/a/another/cool/file.R
root/b/some/data.csv
root/b/more/data.csv
Run Code Online (Sandbox Code Playgroud)

我想在R中创建一个类似unix tree程序输出的图:

root
??? a
?   ??? another
?   ?   ??? cool
?   ?   ?   ??? file.R
?   ?   ??? file.R
?   ??? some
?       ??? file.R
??? b
    ??? more
    ?   ??? data.csv
    ??? some
        ??? data.csv
Run Code Online (Sandbox Code Playgroud)

如果解决方案涉及将文件系统树分解为两个,那将特别有用data.frame:

  1. 节点表(我可以使用其包含修改日期等属性)
  2. 和一个边缘表(也有属性)

然后从这两个data.frames 构建树形图对象.

Kon*_*rad 13

值得补充的是,优秀的fs包提供dir_tree了以非常方便的方式将此功能传递给 R 的功能。

tmp_dir <- tempdir()
# Create some directories
for (i in 1:10) {
    dir.create(path = file.path(tmp_dir,
                                basename(tempfile(pattern = "dir")),
                                basename(tempfile(pattern = "sub_dir"))),
               recursive = TRUE)
}
# Create directory tree
fs::dir_tree(path = tmp_dir, recurse = TRUE)
Run Code Online (Sandbox Code Playgroud)

结果

/tmp/RtmpEhB0ne
??? dir15213121dd5903
?   ??? sub_dir1521315a5425ba
??? dir152131227b086f
?   ??? sub_dir1521314255d96b
??? dir152131353e6603
?   ??? sub_dir1521315b52aeed
??? dir15213136870535
?   ??? sub_dir15213127b34f64
??? dir1521313bbf738b
?   ??? sub_dir152131473939ea
??? dir152131403f4fd5
?   ??? sub_dir152131115296e7
??? dir152131503d0d55
?   ??? sub_dir15213114368572
??? dir1521316f0bb0c3
?   ??? sub_dir1521314aea266b
??? dir1521317fe305e9
?   ??? sub_dir152131bcfe8a
??? dir1521319800dfb
    ??? sub_dir15213129defd4a
Run Code Online (Sandbox Code Playgroud)

除了打印目录树之外,还可以将发现的路径返回给对象。

sink(file = tempfile(fileext = ".log"))
res_fs_tree <- fs::dir_tree(path = tmp_dir, recurse = TRUE)
sink()
res_fs_tree[[1]]
# [1] "/tmp/RtmpEhB0ne/dir15213121dd5903/sub_dir1521315a5425ba"
Run Code Online (Sandbox Code Playgroud)


Tyl*_*ker 12

这是一种可能的方法来获得您最初要求的系统,如树.这将给出一个data.tree非常灵活的对象,可以像你想要的那样进行绘图,但是我并不完全清楚你想要什么:

path <- c(
    "root/a/some/file.R", 
    "root/a/another/file.R", 
    "root/a/another/cool/file.R", 
    "root/b/some/data.csv", 
    "root/b/more/data.csv"
)


library(data.tree); library(plyr)

x <- lapply(strsplit(path, "/"), function(z) as.data.frame(t(z)))
x <- rbind.fill(x)
x$pathString <- apply(x, 1, function(x) paste(trimws(na.omit(x)), collapse="/"))
(mytree <- data.tree::as.Node(x))

1  root                  
2   ¦--a                 
3   ¦   ¦--some          
4   ¦   ¦   °--file.R    
5   ¦   °--another       
6   ¦       ¦--file.R    
7   ¦       °--cool      
8   ¦           °--file.R
9   °--b                 
10      ¦--some          
11      ¦   °--data.csv  
12      °--more          
13          °--data.csv  


plot(mytree)
Run Code Online (Sandbox Code Playgroud)

你可以得到你想要的部分(我认为),但是它需要你做腿部工作并找出数据类型之间的转换data.tree:https://cran.r-project.org/web/packages/data.tree /vignettes/data.tree.html#tree-conversion

https://github.com/trinker/pathr#tree中,我在我的pathr包的tree函数中使用这种方法use.data.tree = TRUE

编辑 Per @ Luke的评论如下...... data.tree::as.Node直接走了一条路:

(mytree <- data.tree::as.Node(data.frame(pathString = path)))

                levelName
1  root2                 
2   ¦--a                 
3   ¦   ¦--some          
4   ¦   ¦   °--file.R    
5   ¦   °--another       
6   ¦       ¦--file.R    
7   ¦       °--cool      
8   ¦           °--file.R
9   °--b                 
10      ¦--some          
11      ¦   °--data.csv  
12      °--more          
13          °--data.csv  
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考,您可以替换所有这些代码,并仅保留顶部创建的 `path` 变量和 `(mytree &lt;- data.tree::as.Node(data.frame(pathString = path)))`。您根本不需要使用 plyr 或进行任何争论。 (2认同)

Sté*_*ent 6

如果你在 Windows 上,你可以使用我的包dir2json,通过像这样安装它:

drat::addRepo("stlarepo")
install.packages("dir2json")
Run Code Online (Sandbox Code Playgroud)

也可以在 Linux 上使用它,但是有一个链接到 GHC 动态库的 DLL,它必须安装在系统上(而这个 DLL 在 Windows 上是独立的)。

> library(dir2json)
> cat(dir2tree("src"))
src
|
`- contrib
   |
   +- PACKAGES.gz
   |
   +- PACKAGES
   |
   +- jsonAccess_0.1.1.tar.gz
   |
   +- expansions_1.2.tar.gz
   |
   `- dir2json_2.1.0.tar.gz
> cat(dir2tree("src", vertical=TRUE))
                                            src                                             
                                             |                                              
                                          contrib                                           
                                             |                                              
      ---------------------------------------------------------------------------           
     /          |                 |                       |                      \          
PACKAGES.gz  PACKAGES  jsonAccess_0.1.1.tar.gz  expansions_1.2.tar.gz  dir2json_2.1.0.tar.gz
Run Code Online (Sandbox Code Playgroud)

该软件包还包含一个 Shiny 应用程序,它生成一个文件夹的交互式 Reingold-Tilford 树表示:

> dir2json::shinyDirTree(".")
Run Code Online (Sandbox Code Playgroud)

Reingold-Tilford 文件夹