在R中生成调用图

34

我收到了一大块格式不佳的单体R代码,其中有很多函数,我希望能够找出哪个函数调用了哪些函数。

我想我可以使用roxygen的@callGraph功能,但是a)这段代码需要在一个包中,这会给这段代码带来麻烦,而且b)当我在我的一个简单包上运行它时,它甚至似乎也无法工作。我看到Roxygen作者之一发布的一篇文章说,由于依赖于Rgraphviz,呼叫图生成被禁用了,但代码还在那里。无论如何。

有没有更好的方法快速确定foo调用了bar、baz和qux,而qux调用了quux?

编辑:基于R的分析系统的解决方案非常好,假设你实际上能运行这段代码...文件中一半的东西都没有运行过,而且我不知道它们是什么...静态分析可能太难了,我想。

编辑2:Roxygen的调用图功能似乎进行了静态分析,基于函数的表达式的递归下降,并检查is.callable。能够在任何函数上运行这个将是可爱的......明天我可能会试试...


您可以查看CRAN上“mvbutils”软件包中的“foodweb”函数。以下是一篇描述其使用方法的文章链接:http://www.r-bloggers.com/r-function-of-the-day-foodweb-2/ 声明:这是我的网站,我写了那篇文章。 - Erik Iverson
我在考虑编写一个函数,可以完全像这样执行某些操作。而就在那时,您发布了上面的博客文章。是伟大的思想如出一辙吗? :) - Roman Luštrik
基本上就是我想要的。现在将输出转换成点格式,或者加载到其他R图形包中... - Spacedman
请查看此帖子,其中包含一个多语言静态调用图生成器,还支持R:stackoverflow.com/a/67692928/251947 - Chris Koknat
4个回答

5

你是否需要使用profr?根据文档说明:

> ?profr
> glm_ex <- profr(example(glm))
Read 17 items
>      head(glm_ex)
             f level time start  end  leaf source
8      example     1 0.32  0.00 0.32 FALSE  utils
9  <Anonymous>     2 0.04  0.00 0.04 FALSE   <NA>
10      source     2 0.28  0.04 0.32 FALSE   base
11  prepare_Rd     3 0.02  0.00 0.02 FALSE   <NA>
12      render     3 0.02  0.02 0.04 FALSE   <NA>
13 getSrcLines     3 0.02  0.04 0.06 FALSE   base
>      summary(glm_ex)
               f          level             time          start       
 eval.with.vis  :10   Min.   : 1.000   Min.   :0.02   Min.   :0.0000  
 <Anonymous>    : 3   1st Qu.: 4.000   1st Qu.:0.02   1st Qu.:0.1200  
 lazyLoadDBfetch: 3   Median : 6.000   Median :0.02   Median :0.2000  
 %in%           : 3   Mean   : 7.211   Mean   :0.03   Mean   :0.1769  
 inherits       : 3   3rd Qu.: 9.000   3rd Qu.:0.02   3rd Qu.:0.2600  
 is.factor      : 3   Max.   :22.000   Max.   :0.32   Max.   :0.3000  
 (Other)        :65                                                   
      end            leaf            source         
 Min.   :0.0200   Mode :logical   Length:90         
 1st Qu.:0.1500   FALSE:75        Class :character  
 Median :0.2400   TRUE :15        Mode  :character  
 Mean   :0.2069   NA's :0                           
 3rd Qu.:0.2800                                     
 Max.   :0.3200                                     

> plot(glm_ex)

在这里输入图片描述

虽然不完全符合您的需求,但您可能可以根据自己的需要进行调整。


4

CodeDepends软件包(CRAN网站GitHub)看起来很有趣,虽然我还没有深入了解。它承诺可以:

  • 在函数集之间创建调用图

可能是通过makeCallGraph()函数实现的。


2

我并没有使用过它,但是快速查看proftools包表明它可以做到这一点。您需要先运行Rprof,然后再使用proftools来分析输出。我认为您想要的是plotProfileCallGraph()函数。


2
除了proftools和profr之外,R Wiki上还有Romain编写的Perl脚本。结合graphviz,它可以生成带权重的图形--更多信息请参见这里

不错。它必须放在R bin目录中吗?它似乎只是作为./Rprof2dot perl脚本运行,我看不到任何R依赖项... - Spacedman
当我使用 Perl 脚本时,我只是将它保存在本地路径或当前目录中。它目前还没有与 R 完全集成。 - Dirk Eddelbuettel
4
链接已失效。 - qed
1
事情总会发生。这已经过去4年半了。看起来Philippe在维护R Wiki方面存在一些问题... - Dirk Eddelbuettel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接