2011-01-25 3 views
25

On m'a donné un gros morceau de code R monolithique mal formaté avec beaucoup de fonctions, et j'aimerais savoir quelles fonctions appellent quelles fonctions. J'ai pensé que je pourrais utiliser les trucs @callGraph de roxygen, mais a) le code doit être dans un paquet, ce qui sera un mal de tête avec ce code, et b) il ne semble même pas fonctionner quand je cours sur un simple paquet de la mienne. Je vois une publication d'un des auteurs de Roxygen disant que la génération de graphe d'appel est désactivée à cause de la dépendance de Rgraphviz, mais le code est là. En tous cas. Quelqu'un a-t-il une meilleure façon de calculer rapidement que foo appelle bar, baz et qux, et que qux appelle quux?Génération d'un graphe d'appel en R

Éditer: Les solutions basées sur le système de profilage de R sont excellentes, en supposant que vous puissiez réellement exécuter le code ... La moitié du contenu des fichiers ne fonctionne pas, et je ne sais pas ce que ça fait ... Statique l'analyse est trop à espérer, je suppose.

Édition 2: La substance du graphe d'appel de Roxygen semble effectuer une analyse statique, basée sur la descente récursive de l'expression de la fonction et vérifiant is.callable. Je serais ravi de pouvoir l'exécuter sur n'importe quelle fonction ... Je peux jouer avec ça demain ...

Répondre

17

Vous pouvez regarder la fonction 'foodweb' du paquet 'mvbutils' sur CRAN. Voici un lien vers un article décrivant son utilisation:

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

Avertissement: ceci est mon site et j'ai écrit cet article.

+0

Je réfléchissais à l'idée d'écrire une fonction qui ferait exactement quelque chose comme ça. Et c'était juste au moment où vous avez posté l'article de blog ci-dessus. Les grands esprits se rencontrent? :) –

+1

À peu près exactement ce que j'étais après. Maintenant, pour transformer la sortie en format de point, ou peut-être le charger dans un autre paquet graphique R ... – Spacedman

3

Est-ce que profr vous aider? De la 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

Pas tout à fait ce que vous recherchez, mais vous pourriez être en mesure de l'adapter à vos besoins.

1

Je ne l'ai pas utilisé, mais un coup d'œil sur le paquet proftools indique qu'il peut le faire. Vous devrez d'abord exécuter Rprof, puis utiliser les outils professionnels pour analyser la sortie. Je pense que vous voulez la fonction plotProfileCallGraph().

3

Outre les proftools et profr, il y a le script Perl de Romain sur le Wiki R. Combiné avec graphviz, il fait des graphiques (avec des bords pondérés) - voir here pour plus.

+0

Nice. Doit-il aller dans le répertoire R bin? Il semble fonctionner comme un script ./Rprof2dot perl, et je ne vois pas de dépendances R ... – Spacedman

+0

Lorsque j'ai utilisé le script Perl, je l'ai simplement conservé dans un chemin local ou dans le répertoire courant. Il n'est pas encore complètement intégré avec R. –

+0

Le lien est maintenant mort. – qed

2

Le paquet CodeDepends (CRAN, website, GitHub) semble intéressant, je n'ai pas examiné cependant. Entre autres, il promet

  • créer des graphiques d'appel entre ensembles de fonctions

probablement par la fonction makeCallGraph().

Questions connexes