34

我得到了一大块格式很差的单片 R 代码,里面有很多函数,我想弄清楚什么函数调用什么函数。

我以为我可以使用 roxygen 的 @callGraph 东西,但是 a) 代码需要放在一个包中,这对这段代码来说会让人头疼,并且 b) 当我在一个简单的设备上运行它时它甚至似乎都不起作用我的包。我看到一位 Roxygen 作者的帖子说,由于 Rgraphviz 依赖关系,调用图生成被禁用,但代码在那里。反正。

有谁有更好的方法来快速计算出 foo 调用 bar、baz 和 qux,而 qux 调用 quux?

编辑:基于 R 分析系统的解决方案很棒,假设您可以实际运行代码......文件中的一半内容没有运行,我不知道它做了什么......静态分析太多了希望,我猜。

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

4

4 回答 4

5

教授会帮助你吗?从文档中:

> ?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)

在此处输入图像描述

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

于 2011-01-25T16:24:08.827 回答
4

这个CodeDepends包(CRAN网站GitHub)看起来很有趣,不过我还没有研究过。其中,它承诺

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

大概是通过makeCallGraph()函数。

于 2016-01-19T14:33:17.720 回答
2

我没有使用它,但是快速浏览一下proftools包表明它可以做到这一点。您必须先运行 Rprof,然后使用 proftools 分析输出。我想你想要这个plotProfileCallGraph()功能。

于 2011-01-25T16:25:40.857 回答
2

除了 proftools 和 profr,R Wiki 上还有 Romain 的 Perl 脚本。与 graphviz 结合使用,它会生成图形(边缘加权)——更多信息请参见此处

于 2011-01-25T16:49:32.330 回答