在R中生成调用图

时间:2011-01-25 16:17:56

标签: r call-graph

我已经获得了大量格式不佳的单片R代码,并且有很多功能,我想知道哪些函数调用了什么函数。

我以为我可以使用roxygen的@callGraph东西,但是a)代码需要在一个包中,这将是这个代码的头疼,并且b)当我运行它时它甚至似乎都不起作用在我的简单包装上。我看到其中一位Roxygen作者发布了一条帖子,称由于Rgraphviz依赖性而禁用了调用图生成,但代码就在那里。反正。

任何人都有更好的方法快速计算foo调用bar,baz和qux,而qux调用quux?

编辑:基于R的分析系统的解决方案非常棒,假设您可以实际运行代码...文件中的一半东西不能运行,我不知道它的作用...静态分析我想是太过于希望了。

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

4 个答案:

答案 0 :(得分:4)

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)

enter image description here

不完全是你所追求的,但你可以根据自己的需要进行调整。

答案 1 :(得分:2)

我没有使用它,但快速查看proftools包表明它可以执行此操作。您必须先运行Rprof然后使用proftools来分析输出。我想你想要plotProfileCallGraph()功能。

答案 2 :(得分:2)

除了proftools和profr之外,Rmain上还有Romain的Perl脚本。结合graphviz,它会绘制图形(边缘加权) - 请参阅here了解更多信息。

答案 3 :(得分:2)

CodeDepends包(CRANwebsiteGitHub)看起来很有趣,但我还没有调查过。其中,它承诺

  
      
  • 在各组功能之间创建调用图
  •   

可能是通过makeCallGraph()函数。