Dupliqué possible: strong>
générer un graphique d'appel dans R P>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. P>
J'ai rencontré cette fonction dans un article de blog par Milktrader avec lequel je peux faire quelque chose de similaire pour
forfaits forts> (ou espaces de noms) p> xxx pré> Pourtant, je voudrais une fonction où
nom Code> 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 code>. p>
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 () code> et / ou
chute de neige :: sfsouce code>. P>
Modifier 2012-08-08 P>
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. P> blockQquote>
3 Réponses :
Il doit y avoir de meilleurs traitements là-bas, mais voici ma tentative: et les résultats: p> comme vous pouvez le voir La version récursive renvoie beaucoup de fonctions. Le problème avec cela est-il renvoie
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 code> de celui qui s'appuie sur
CodeTools code> fonctionnalité!
Essayez cet exemple: puis, p>
Merci beaucoup pour votre réponse et le pointeur sur CodeTools code>! 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).
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> courtoisie de Edward . p> courtoisie de kohske p> 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 Fonction interne 1 h2>
fonction intérieure 2
fonction wrapper h2>
.globalenv code>) qui n'ont pas encore été déplacés à un colis. p>
application h2>
fonction interne 1 h2>
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
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 = ":")) code> fonctionne aussi.
@GuCycoder: Merci pour le pointeur. Afaiu, toutes les réponses vont générer un appel graphique i>. 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 code> 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 code> et
callees.of code> 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!