【问题标题】:Generating a Call Graph in R在 R 中生成调用图
【发布时间】:2011-06-15 07:45:16
【问题描述】:

我收到了一大块格式不正确的带有大量函数的单片 R 代码,我想弄清楚哪些函数调用了哪些函数。

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

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

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

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

【问题讨论】:

  • 您可以查看 CRAN 上“mvbutils”包中的“foodweb”功能。这是一篇描述其用法的文章的链接:r-bloggers.com/r-function-of-the-day-foodweb-2 免责声明:这是我的网站,我写了那篇文章。
  • 我在考虑写一个函数来做这样的事情。那是您发布上述博客文章的时间。英雄所见略同? :)
  • 几乎就是我所追求的。现在将输出转换为点格式,或者将其加载到其他 R 图形包中......
  • 多语言静态调用图生成器见这篇文章,也支持R:stackoverflow.com/a/67692928/251947

标签: r call-graph


【解决方案1】:

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)

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 不错。它必须进入 R bin 目录吗?它似乎像 ./Rprof2dot perl 脚本一样运行,我看不到任何 R 依赖项...
      • 当我使用perl脚本时,我只是将它保存在本地路径或当前目录中。它尚未与 R 完全集成。
      • 链接已失效。
      • 事情发生了。那是4 1/2年。看来 Philippe 在保持 R Wiki 上存在问题......
      【解决方案4】:

      CodeDepends 包(CRANwebsiteGitHub)看起来很有趣,不过我还没有研究过。其中,它承诺

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

      大概是通过makeCallGraph()函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-05
        • 2017-06-24
        相关资源
        最近更新 更多