2016-03-18 26 views
6

Podana ścieżka katalogu bezwzględnego katalogu głównego. Jak wygenerować obiekt dendrogramu wszystkich ścieżek poniżej, aby móc wizualizować drzewo katalogów z R?Jak zbudować dendrogram z drzewa katalogów?

Załóżmy, że następujące połączenie zwróciło następujące węzły listkowe.

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 

Chciałbym zrobić wykres w R jak wyjście z programu UNIX tree:

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

Byłoby to szczególnie przydatne, jeśli roztwór zaangażowany rozkładając drzewo systemu plików na dwa: data.frame:

  1. o stół Węzły F (z których mogę zawierać atrybuty takie jak data modyfikacji)
  2. i stół krawędzi (również atrybuty)

a następnie budowa przedmiotu dendrogram z tych dwóch data.frame s.

+0

dokładnie, jaki rodzaj działki miałeś na myśli? Czy możesz pokazać przykład, w jaki sposób chcesz sformatować dane i jak zaplanować dendrogram? Pomocne może być wszystko, co sprawi, że problem będzie bardziej powtarzalny (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example). – MrFlick

+0

Prosta hierarchiczna fabuła drzewa byłaby świetnym pierwszym krokiem. Ale mam nadzieję stworzyć mapę drzewa. – wdkrnls

+0

I chciałbym kolor atrybutów takich jak data modyfikacji. – wdkrnls

Odpowiedz

8

Oto możliwe podejście do uzyskania tego, o co prosiło się, a które jest systemem podobnym do drzewa. To daje data.tree obiekt, który jest dość elastyczny i może być wykonana na działce jak możesz, ale nie jest do końca jasne dla mnie, co chcesz:

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) 

Można dostać części, które chcesz (myślę), to jednak „ll wymagają, aby wykonać pracę nóg i dowiedzieć się konwersji pomiędzy typami danych w data.tree: https://cran.r-project.org/web/packages/data.tree/vignettes/data.tree.html#tree-conversion

używam tego podejścia w moim pathr innych pakietów tree funkcję podczas use.data.tree = TRUEhttps://github.com/trinker/pathr#tree

EDIT Per @ komentarzu Łukasza poniżej ... data.tree::as.Node bierze ścieżkę bezpośrednio:

(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

Tylko FYI, możesz zamienić cały ten kod i zachować tylko utworzoną zmienną 'path' na górze i' (mytree <- data.tree :: as.Node (data.frame (pathString = path))) . Nie musisz używać plyr ani żadnych sporów. – Luke

+0

@Luke Excellent Dodam to do odpowiedzi –

+0

'mytree' ma być środowiskiem, prawda? (class() nadal daje "Węzeł" "R6") Pytam, ponieważ działka (mytree) w RStudio otwiera zakładkę "Przeglądarka", której nigdy nie używałem i prawie nigdy nie zauważyłem. Czy istnieje sposób na wykreślenie go w zwykłym urządzeniu graficznym? Wyjście konsoli jest obcinane w moim przypadku - dlatego pytam. – mattu

0

Jeśli jesteś na systemie Windows można używać pakietu dir2json, instalując go tak:

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

Można go również używać w systemie Linux, ale istnieje biblioteka DLL połączona z bibliotekami dynamicznymi GHC, które muszą być zainstalowane w systemie (podczas gdy ta biblioteka DLL jest samodzielna w systemie 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 

Pakiet zawiera również błyszczącą aplikację, która generuje interaktywną Reingold-Tilford reprezentację drzewa folderu:

> dir2json::shinyDirTree(".") 

Reingold-Tilford folder

Powiązane problemy