我需要处理由其他人编写的相对较大的R代码。代码没有文档,它被分成无数个文件,每个文件都可以包含一个或多个函数。原作者没有使用Makefile,所以没有关于什么叫什么的文档。
作为第一步,我想建立一个树状图。我的意思是一棵树,其根是主文件,内部节点是被调用的各种文件,叶子(终端节点)是不调用其他文件中定义的函数的文件。有没有办法自动完成?图片输出会很棒,但即使是文本文件也可以。 R Studio解决方案也可以。
编辑:显然我的描述不够明确,因此我添加了一个非常简单(实际上是琐碎的)示例。假设我有4个源文件main.r
,foo.r
,bar.r
和blargh.r
,都在同一个文件夹中(真实案例包含~50个文件"整齐&# 34;存储在同一个红色文件夹中,连同输入/输出文件)。 main.r
的内容是:
# main.r
source("foo.r")
source("bar.r")
source("blargh.r")
foo()
bar()
foo.r
:
# foo.r
foo <- function(){
print("I'm foo")
blargh()
}
bar.r
:
# bar.r
bar <- function(){
print("I'm bar")
blargh()
}
blargh.r
# blargh.r
blargh <- function(){
print("I'm blargh")
}
我需要生成的是这样的图表:
main.r
¦--foo.r
¦ ¦
¦ °--blargh.r
¦
°--bar.r
¦
°--blargh.r
答案 0 :(得分:8)
假设path
包含所有子目录和文件,
files <- list.files(path, full.names = TRUE, recursive = TRUE)
#for eg.
files<- c(
"root/dir1/some/file1.R",
"root/dir1/another1/file2.R",
"root/dir1/another1/new/file3.R",
"root/dir2/some/data1.csv",
"root/dir2/more/data2.csv"
)
现在,您拥有files
变量中的所有文件。
library(data.tree)
library(plyr)
a <- lapply(strsplit(files, "/"), function(z) as.data.frame(t(z)))
a <- rbind.fill(a)
mytree <- data.tree::as.Node(data.frame(pathString = path))
plot(mytree)
1 root
2 ¦--dir1
3 ¦ ¦--some
4 ¦ ¦ °--file1.R
5 ¦ °--another1
6 ¦ ¦--file2.R
7 ¦ °--new
8 ¦ °--file3.R
9 °--dir2
10 ¦--some
11 ¦ °--data1.csv
12 °--more
13 °--data2.csv
注意:此结构称为dendogram。 希望这会有所帮助。