为R代码

时间:2017-05-26 09:54:46

标签: r rstudio diagram call-graph

我需要处理由其他人编写的相对较大的R代码。代码没有文档,它被分成无数个文件,每个文件都可以包含一个或多个函数。原作者没有使用Makefile,所以没有关于什么叫什么的文档。

作为第一步,我想建立一个树状图。我的意思是一棵树,其根是主文件,内部节点是被调用的各种文件,叶子(终端节点)是不调用其他文件中定义的函数的文件。有没有办法自动完成?图片输出会很棒,但即使是文本文件也可以。 R Studio解决方案也可以。

编辑:显然我的描述不够明确,因此我添加了一个非常简单(实际上是琐碎的)示例。假设我有4个源文件main.rfoo.rbar.rblargh.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          

1 个答案:

答案 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。 希望这会有所帮助。