Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Generating a Call Graph in R

Tags:

r

call-graph

I've been given a big chunk of poorly formatted monolithic R code with plenty of functions, and I'd like to work out what functions call what functions.

I thought I could use roxygen's @callGraph stuff, but a) the code needs to be in a package, which will be a headache with this code, and b) it doesn't even seem to work when I do run it on a simple package of mine. I see a posting from one of the Roxygen authors saying call graph generation is disabled because of the Rgraphviz dependency, but the code is there. Anyway.

Anyone got a better way of quickly working out that foo calls bar, baz, and qux, and that qux calls quux?

Edit: Solutions based on R's profiling system are great, assuming you can actually run the code... Half the stuff in the files doesn't get run, and I don't know what it does... Static analysis is too much to hope for, I guess.

Edit 2: Roxygen's call graph stuff seems to do a static analysis, based on recursive descent of the expression of the function and checking for is.callable. It would be lovely to be able to run this on any function... I may play with this tomorrow...

like image 700
Spacedman Avatar asked Jan 25 '11 16:01

Spacedman


1 Answers

Would profr help you out? From the documentation:

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

Not quite what you are after, but you may be able to adapt it to your needs.

like image 66
csgillespie Avatar answered Sep 27 '22 17:09

csgillespie