Создание графика вызовов в R
Мне дали большой кусок плохо отформатированного монолитного R-кода с большим количеством функций, и я хотел бы выяснить, какие функции вызывают функции.
Я думал, что могу использовать материал roxygen @callGraph, но: а) код должен быть в пакете, который будет головной болью с этим кодом, и б) он даже не работает, когда я его запускаю на простой мой пакет. Я вижу публикацию от одного из авторов Roxygen, говорящего о том, что генерация графа вызовов отключена из-за зависимости Rgraphviz, но код есть. Так или иначе.
У кого-нибудь есть лучший способ быстро разработать эту панель вызовов foo, baz и qux, а qux вызывает quux?
Изменить: Решения, основанные на R-профилирующей системе, великолепны, если вы действительно можете запустить код... Половина материала в файлах не запускается, и я не знаю, что он делает... Статический анализ Наверное, слишком много надеяться.
Редактирование 2: материал графического представления Roxygen, похоже, выполняет статический анализ, основанный на рекурсивном спуска выражения функции и проверки на is.callable. Было бы прекрасно, если бы можно было запустить это на любой функции... Я могу играть с этим завтра...
Ответы
Ответ 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()
.