Подтвердить что ты не робот

Создание графика вызовов в R

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

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

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

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

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

4b9b3361

Ответ 1

Вы можете посмотреть функцию "foodweb" из пакета "mvbutils" на CRAN. Вот ссылка на статью, описывающую ее использование:

http://www.r-bloggers.com/r-function-of-the-day-foodweb-2/

Отказ от ответственности: это мой сайт, и я написал эту статью.

Ответ 2

Будет ли 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 :0                           
 3rd Qu.:0.2800                                     
 Max.   :0.3200                                     

> plot(glm_ex)

enter image description here

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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