9
votes

Découvrez quelles fonctions sont appelées dans une fonction donnée

Dupliqué possible:
générer un graphique d'appel dans R

J'aimerais analyser systématiquement une fonction donnée pour déterminer quelles autres fonctions sont appelées dans cette fonction même. Si possible, récursivement.

J'ai rencontré cette fonction dans un article de blog par Milktrader avec lequel je peux faire quelque chose de similaire pour forfaits (ou espaces de noms) xxx

Pourtant, je voudrais une fonction où nom serait le nom d'une fonction et la valeur de retour est un vecteur de caractère (ou une liste, si elle est terminée de manière récursive) des fonctions appelées dans nom .

Motivation < / H2>

J'ai besoin d'une sorte de sortie basée sur le caractère (vecteur ou liste). La raison en est que je travaille sur une fonction de wrapper générique pour la parallélisation d'une "fonction intérieure" abriarienne où vous ne devez pas passer à travers un processus d'essai et d'erreur de consommation de temps afin de déterminer quelles autres fonctions le La fonction interne dépend. Donc, la sortie de la fonction que je suis après sera directement utilisée dans chute de neige :: sfexport () et / ou chute de neige :: sfsouce .

Modifier 2012-08-08

Comme il y a eu des votes rapprochés en raison de la duplicité, je vais vérifier comment les réponses peuvent être fusionnées avec l'autre question demain.


9 commentaires

Voir générer un graphique d'appel dans R . Le mot clé étant Call Graphe


Je ne connais pas la réponse, mais listfunctions <- fonction (nom) ls (coller ("package", nom, sep = ":")) fonctionne aussi.


@GuCycoder: Merci pour le pointeur. Afaiu, toutes les réponses vont générer un appel graphique . C'est bien, mais pas exactement ce dont j'ai besoin (voir la poste mise à jour). Je suis sûr que les fonctions mentionnées me donneront des idées précieuses sur la manière de trouver une fonction qui correspond à mes besoins, mais peut-être déjà quelque chose?


@Karstenw .: Merci, toujours agréable de voir des voies alternatives! Je viens vraiment de la copier du poteau et je ne l'ai pas donné beaucoup plus de pensée.


Bien que FoodWeb générera un graphique par défaut, il renvoie également (invisible) un objet contenant les informations d'appel en tant que matrice (avec d'autres choses). Consultez la section Valeur de la page d'aide de FoodWeb, ainsi que appelants.of et callees.of documenté dans la même page.


@Briandiggs: cool, cela ressemble plus à cela. Merci!


C'est un graphique d'appels même s'il n'y a pas de sortie graphique. Le graphique dans ce sens est dans un sens mathématique des nœuds et des bords de connexion (directionnels). C'est-à-dire que la théorie des graphes.


@Briandiggs: Ah, d'accord, obtenez-le ;-)


@GuCycoder: hey pas de problème, je ne voulais pas sembler inégazé, je n'ai tout simplement pas vu le lien direct après votre premier post. Très appréciée!


3 Réponses :


6
votes

Il doit y avoir de meilleurs traitements là-bas, mais voici ma tentative: xxx

et les résultats: xxx

comme vous pouvez le voir La version récursive renvoie beaucoup de fonctions. Le problème avec cela est-il renvoie chaque fonction appelée dans le processus, ce qui s'ajoute évidemment comme vous allez. En tout cas, j'espère que vous pouvez l'utiliser (ou le modifier) ​​pour répondre à vos besoins.


2 commentaires

Merci mec, j'ai travaillé avec votre approche un peu aujourd'hui. Modifié un couple de choses (principalement un tampon "global" pour des fonctions déjà vérifiées; pensez que c'est la raison pour laquelle votre code récursif a pris si longtemps) et a ajouté certaines fonctionnalités (voir ma réponse).


Nice, votre approche a un temps de traitement à 0.6870 de celui qui s'appuie sur CodeTools fonctionnalité!



7
votes

Essayez cet exemple: xxx

puis, xxx


2 commentaires

Merci beaucoup pour votre réponse et le pointeur sur CodeTools ! Je n'avais pas le temps de vérifier les deux réponses jusqu'à présent, alors j'ai commencé avec la réponse d'Edward, car j'aime comprendre les détails de la façon de le faire avec la fonctionnalité de base R avant de passer aux packages de contributions. Mais les codools semblent assez prometteurs.


On dirait que l'approche de CodeTools est un peu plus lente par rapport à l'approche Edwards que je n'aurais réellement pas pensé (voir propre réponse).



2
votes

Disclaimer

Cette réponse est basée sur des réponses de Edward et Kohske . Je vais pas strong> Considérez ceci pour la réponse enfin acceptée, son objectif principal est simplement de documenter une autre approche et une autre approche prolongée et des points de repère pour les autres utilisateurs. P>

Fonction interne 1 h2>

courtoisie de Edward . p> xxx pré>

fonction intérieure 2

courtoisie de kohske p> xxx pré>

fonction wrapper h2>

Ce wrapper vous permet de choisir la fonction interne réelle utilisée et permet de spécifier les espaces de noms qui doivent ou ne doivent pas être pris en compte. C'est important pour mon étui d'utilisation (voir la section Motivation forte> ci-dessus), car je ne suis généralement intéressé que par "propre" fonctions (dans .globalenv code>) qui n'ont pas encore été déplacés à un colis. p> xxx pré>

application h2> xxx pré>

fonction interne 1 h2> xxx pré >

Benchmark Fonction interne 2 H2>
> bench <- microbenchmark(listFunctions("install.packages",
+         innerFunction=listFunctions2_inner))
bench
> Unit: milliseconds
                                                                     expr
1 listFunctions("install.packages", innerFunction = listFunctions2_inner)
       min       lq   median       uq      max
1 207.0299 212.3286 222.6448 324.6399 445.4154

> bench <- microbenchmark(listFunctions("install.packages", 
+     innerFunction=listFunctions2_inner, do.recursive=TRUE), times=3)
bench
Warning message:
In nm[nm == ""] <- exprnm[nm == ""] :
  number of items to replace is not a multiple of replacement length
> Unit: seconds
                                                                      expr
1 listFunctions("install.packages", innerFunction = listFunctions2_inner, 
       min       lq   median       uq      max
1 7.673281 8.065561 8.457841 8.558259 8.658678


0 commentaires