Как построить дендрограмму из дерева каталогов?

учитывая абсолютный путь корневого каталога. Как создать объект дендрограммы всех путей под ним, чтобы я мог визуализировать дерево каталогов с 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.frames:

  1. таблица узлов (с которой я мог бы включить такие атрибуты, как дата изменения)
  2. и таблица ребер (также с атрибутами)

и затем построение объекта дендрограммы из этих двух data.frames.

2 ответов


вот возможный подход, чтобы получить то, что вы изначально просили, что является системой, такой как дерево. Это даст 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 пакета


если вы находитесь в Windows, вы можете использовать мой пакет dir2json, установив его так:

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

его также можно использовать в Linux, но есть DLL, связанная с динамическими библиотеками GHC, которые должны быть установлены в системе (в то время как эта 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

пакет также содержит блестящее приложение, которое генерирует интерактивное представление дерева Reingold-Tilford папка:

> dir2json::shinyDirTree(".")

Reingold-Tilford folder