Генерация графа вызовов в R - PullRequest
29 голосов
/ 25 января 2011

Мне дали большой кусок плохо отформатированного монолитного R-кода с большим количеством функций, и я хотел бы выяснить, какие функции вызывают какие функции.

Я думал, что смогу использовать @callGraph от roxygen, но а) код должен быть в пакете, что будет головной болью с этим кодом, и б) он даже не работает, когда яЗапустите его на моей простой упаковке.Я вижу сообщение от одного из авторов Roxygen, в котором говорится, что генерация графа вызовов отключена из-за зависимости Rgraphviz, но код там есть.В любом случае.

Кто-нибудь получил лучший способ быстро решить, что foo вызывает bar, baz и qux, и что qux вызывает quux?

Редактировать: Решения, основанные на системе профилирования R, хороши,при условии, что вы действительно можете запустить код ... Половина файлов в файлах не запускается, и я не знаю, что он делает ... Статистический анализ - это слишком много, на что я надеюсь.

Правка 2. Похоже, что граф вызовов Кислорода выполняет статический анализ, основанный на рекурсивном снижении выражения функции и проверке is.callable.Было бы прекрасно иметь возможность запускать это для любой функции ... Я могу поиграть с этим завтра ...

Ответы [ 4 ]

4 голосов
/ 25 января 2011

профр поможет вам? Из документации:

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

Не совсем то, что вы ищете, но вы можете адаптировать его к вашим потребностям.

2 голосов
/ 19 января 2016

Пакет CodeDepends ( CRAN , веб-сайт , GitHub ) выглядит интересно, хотя я не рассматривал его. Среди прочего обещает

  • создание графов вызовов между наборами функций

предположительно через функцию makeCallGraph().

2 голосов
/ 25 января 2011

Помимо proftools и profr, в R Wiki есть сценарий Perl от Romain.В сочетании с graphviz он создает графики (с взвешенными ребрами) - см. здесь , чтобы узнать больше.

2 голосов
/ 25 января 2011

Я не использовал его, но быстрый просмотр пакета proftools показывает, что он может это сделать. Сначала вам нужно будет запустить Rprof, а затем использовать proftools для анализа вывода. Я думаю, что вы хотите функцию plotProfileCallGraph().

...