【问题标题】:How to build a dendrogram from a directory tree?如何从目录树构建树状图?
【发布时间】:2016-07-05 18:52:21
【问题描述】:

给定一个根绝对目录路径。如何生成它下面所有路径的树状图对象,以便我可以用 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

我想在 R 中绘制一个类似于 unix tree 程序的输出的图:

root
├── a
│   ├── another
│   │   ├── cool
│   │   │   └── file.R
│   │   └── file.R
│   └── some
│       └── file.R
└── b
    ├── more
    │   └── data.csv
    └── some
        └── data.csv

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

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

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

【问题讨论】:

  • 您到底想到了什么类型的情节?您能否举例说明您希望如何格式化数据以及如何绘制树状图?任何有助于解决问题的方法reproducible 都会有所帮助。
  • 一个简单的层次树图将是一个很好的第一步。但我也希望制作一张树状图。
  • 我想为修改日期等属性着色。
  • 目前这一切都是假设性的。如果你能把它具体化,那会有所帮助。是读取文件系统的问题吗?问题出在图上吗?如果两者兼而有之,则将其分为两部分会更容易(也许是单独的问题)。提供所需数据或示例参考图。
  • 你在 Linux 下使用 R 吗?

标签: r dendrogram


【解决方案1】:

这是一种可能的方法来获取您最初要求的内容,即类似于树的系统。这将提供一个 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)

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

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

编辑 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  

【讨论】:

  • 仅供参考,您可以替换所有代码,只保留顶部创建的path 变量和(mytree &lt;- data.tree::as.Node(data.frame(pathString = path)))。您根本不需要使用 plyr 或进行任何争论。
  • @Luke 太好了,我会把这个添加到答案中
  • mytree 应该是一个环境,对吧? (class() 仍然给出“Node”“R6”)我在问,因为 RStudio 中的 plot(mytree) 打开了一个我从未使用过且几乎没有注意到的“查看器”选项卡。有没有办法让它在普通的图形设备中绘制?在我的情况下,控制台输出被截断——这就是我问的原因。
【解决方案2】:

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

drat::addRepo("stlarepo")
install.packages("dir2json")

在 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

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

> dir2json::shinyDirTree(".")

【讨论】:

  • 嗨@Stéphane Laurent 我在安装 dir2json 包时遇到问题。这是我收到的错误:Error: package or namespace load failed for 'dir2json': .onLoad failed in loadNamespace() for 'rJava', details: call: fun(libname, pkgname) error: JAVA_HOME cannot be determined from the Registry Error: loading failed Execution halted *** arch - x64 ERROR: loading failed for 'i386' * removing 'C:/Users//Documents/R/win-library/3.6/dir2json' Warning in install.packages : installation of package ‘dir2json’ had non-zero exit status
  • R 似乎无法打开这个对我来说不存在的 URL:Warning in install.packages : unable to access index for repository https://stlarepo.github.io/drat/bin/windows/contrib/3.6: cannot open URL 'https://stlarepo.github.io/drat/bin/windows/contrib/3.6/PACKAGES'
  • @Jasppo 啊,是的,R 3.6 不存在。你可以试试install.packages("dir2json", type = "source")吗?
【解决方案3】:

值得补充的是,出色的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)

结果

/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

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

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"

【讨论】:

  • 这太棒了——我什至在使用 fs 并找不到它,因为 dir_tree 似乎与 print/viz 无关。
猜你喜欢
  • 1970-01-01
  • 2022-01-07
  • 2019-12-17
  • 1970-01-01
  • 2015-09-28
  • 2016-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多