2011-01-25 18 views
25

Dostałem dużą porcję źle sformatowanego monolitycznego kodu R z mnóstwem funkcji i chciałbym się dowiedzieć, jakie funkcje wywołują funkcje.Generowanie wykresu wywołań w R

Pomyślałem, że mogę użyć rzeczy roxygena @callGraph, ale a) kod musi znajdować się w pakiecie, który będzie ból głowy z tym kodem, i b) nawet nie wydaje się działać, gdy biegnę to na moim prostym pakiecie. Widzę wiadomość od jednego z autorów Roxygen mówiącą, że generowanie wykresów połączeń jest wyłączone z powodu zależności Rgraphviz, ale kod tam jest. Tak czy inaczej.

Ktoś ma lepszy sposób szybkiego opracowywania tego foo call bar, baz i qux, a qux wywołuje quux?

Edytuj: Rozwiązania oparte na systemie profilowania R są świetne, zakładając, że możesz uruchomić kod ... Połowa rzeczy w plikach nie działa, a ja nie wiem, co robi ... Statyczny Analiza jest zbyt duża, by można się było spodziewać, jak sądzę.

Edycja 2: Grafy wywołania Roxygen wydają się wykonywać statyczną analizę, opartą na rekurencyjnym zejściu wyrażenia funkcji i sprawdzeniu, czy is.callable. Byłoby wspaniale móc uruchomić to w dowolnej funkcji ... Mogę grać z tym jutro ...

Odpowiedz

17

Możesz zajrzeć do funkcji "foodweb" z pakietu "mvbutils" na CRAN. Tu jest link do artykułu opisującego jej wykorzystania:

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

Zastrzeżenie: to jest moja strona i pisałem ten artykuł.

+0

Zastanawiałem się nad pomysłem napisania funkcji, która zrobiłaby coś takiego. I tak było w tym czasie, kiedy opublikowałeś powyższy wpis na blogu. Wielkie umysły myślą podobnie? :) –

+1

Prawie dokładnie to, po czym byłem. Teraz, aby włączyć wyjście do formatu kropki, lub może załadować go do jakiegoś innego pakietu graficznego R ... – Spacedman

3

Czy pomocny byłby profr? Z dokumentacji:

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

Nie całkiem to, czego po, ale może być w stanie dostosować go do swoich potrzeb.

1

Nie użyłem tego, ale szybkie spojrzenie na pakiet proftools wskazuje, że może to zrobić. Najpierw będziesz musiał uruchomić Rprof, a następnie użyć profetoli do analizy wyników. Myślę, że chcesz funkcję plotProfileCallGraph().

3

Poza proftools i profrem, istnieje skrypt Perla autorstwa Romaina na wiki R. W połączeniu z graphviz, wykonuje wykresy (z ważonymi krawędziami) - więcej informacji na stronie here.

+0

Nice. Czy musi iść w katalogu bin R? Wydaje się działać tak jak skrypt perl ./Rprof2dot i nie widzę żadnych zależności R ... – Spacedman

+0

Kiedy użyłem skryptu perl, po prostu trzymałem go w lokalnej ścieżce lub bieżącym katalogu. Jest jeszcze nie w pełni zintegrowany z R. –

+0

Link jest już martwy. – qed

2

CodeDepends pakiet (CRAN, website, GitHub) wygląda interesująco, nie spojrzał na nią jednak. Między innymi, obiecuje

  • tworzenie wykresów dzwonienie pomiędzy zestawami funkcji

przypuszczalnie poprzez funkcję makeCallGraph().

Powiązane problemy