如何从目录树构建树状图?
How to build a dendrogram from a directory tree?
给定根绝对目录路径。如何生成其下方所有路径的树状图对象,以便我可以使用 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
:
- 一个 table 个节点(我可以用它包含修改日期等属性)
- 和 table 个边(也有属性)
然后从这两个 data.frame
构建树状图对象。
这里有一种可能的方法来获得您最初要求的系统,如树。这将提供一个非常灵活的 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
当 use.data.tree = TRUE
https://github.com/trinker/pathr#tree
时,我在我的 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
如果你在 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(".")
值得添加出色的 fs package offers 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"
给定根绝对目录路径。如何生成其下方所有路径的树状图对象,以便我可以使用 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
:
- 一个 table 个节点(我可以用它包含修改日期等属性)
- 和 table 个边(也有属性)
然后从这两个 data.frame
构建树状图对象。
这里有一种可能的方法来获得您最初要求的系统,如树。这将提供一个非常灵活的 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
当 use.data.tree = TRUE
https://github.com/trinker/pathr#tree
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
如果你在 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(".")
值得添加出色的 fs package offers 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"