2016-03-18 3 views
6

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

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

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

+0

точно, какой тип сюжета вы имеете в виду? Можете ли вы показать пример того, как вы хотите форматировать данные и как вы будете строить свою дендрограмму? Все, что поможет сделать проблему более [воспроизводимой] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example), было бы полезно. – MrFlick

+0

Простой иерархический график деревьев станет отличным первым шагом. Но я надеюсь также создать древовидную карту. – wdkrnls

+0

И я хотел бы покрасить атрибуты, такие как измененная дата. – wdkrnls

ответ

8

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

Я использую этот подход в моем pathrtree набор функций, когда use.data.tree = TRUEhttps://github.com/trinker/pathr#tree

EDIT Per @ комментарий Луки ниже ... 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 
+0

Просто FYI, вы можете заменить весь этот код и сохранить только созданную переменную path в верхней части и '(mytree <- data.tree :: as.Node (data.frame (pathString = path))) , Вам не нужно использовать plyr или вообще переговариваться. – Luke

+0

@ Luke Excellent Я добавлю это к ответу –

+0

'mytree' должен быть окружением, не так ли? (class() все еще дает «Node» «R6») Я спрашиваю, потому что сюжет (mytree) в RStudio открывает вкладку «Просмотр», которую я никогда не использовал и почти никогда не замечал. Есть ли способ сделать это в обычном графическом устройстве? Консольный вывод усечен в моем случае - вот почему я спрашиваю. – mattu

0

Если вы находитесь на 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 

Пакет также содержит Блестящая приложение, которое создает интерактивный Рейнгольд-Tilford древовидное представление папки:

> dir2json::shinyDirTree(".") 

Reingold-Tilford folder

Смежные вопросы