2011-01-25 13 views
25

Mi è stata data una grossa porzione di codice R monolitico formattato in modo scadente con un sacco di funzioni, e mi piacerebbe capire quali funzioni chiamano quali funzioni.Generazione di un grafico di chiamata in R

Ho pensato che potrei usare roxygen's @callGraph, ma a) il codice deve essere in un pacchetto, che sarà un mal di testa con questo codice, eb) non sembra nemmeno funzionare quando eseguo su un mio semplice pacchetto. Vedo un post di uno degli autori di Roxygen che dice che la generazione del grafo delle chiamate è disabilitata a causa della dipendenza da Rgraphviz, ma il codice è presente. Comunque.

Chiunque ha un modo migliore di elaborare rapidamente le chiamate di foo bar, baz e qux e qux chiama quux?

Modifica: le soluzioni basate sul sistema di profilazione di R sono ottime, presupponendo che sia possibile eseguire il codice ... La metà dei file nei file non viene eseguita e non so cosa faccia ... Statico l'analisi è troppo sperare, suppongo.

Modifica 2: le informazioni sul grafico delle chiamate di Roxygen sembrano eseguire un'analisi statica, basata sulla discesa ricorsiva dell'espressione della funzione e il controllo di is.callable. Sarebbe bello essere in grado di eseguire questo su qualsiasi funzione ... Potrei giocare con questo domani ...

risposta

17

Si potrebbe guardare la funzione 'foodweb' dal pacchetto 'mvbutils' su CRAN. Ecco un link ad un articolo che descrive il suo utilizzo:

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

Esonero di responsabilità: questo è il mio sito e ho scritto quell'articolo.

+0

Stavo riflettendo sull'idea di scrivere una funzione che avrebbe fatto qualcosa del genere. E quello era giusto nel momento in cui hai pubblicato il post sul blog di cui sopra. Grandi menti pensano allo stesso modo? :) –

+1

Praticamente esattamente quello che stavo cercando. Ora per trasformare l'output in formato punto, o magari caricarlo in qualche altro pacchetto grafico R ... – Spacedman

3

profr aiutarvi? Dalla documentazione:

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

Non è proprio quello che stai dopo, ma si può essere in grado di adattarsi alle proprie esigenze.

1

Non l'ho usato, ma una rapida occhiata al pacchetto proftools indica che può farlo. Dovrai prima eseguire Rprof e poi usare proftools per analizzare l'output. Penso che tu voglia la funzione plotProfileCallGraph().

3

Oltre a proftools e profr, c'è lo script Perl di Romain su R Wiki. Combinato con graphviz, fa grafici (con bordi ponderati) - vedi here per ulteriori informazioni.

+0

Bello. Deve andare nella directory R bin? Sembra funzionare come uno script ./Rprof2dot perl, e non riesco a vedere alcuna dipendenza R ... – Spacedman

+0

Quando ho usato lo script perl, l'ho semplicemente tenuto in un percorso locale o nella directory corrente. È ancora non completamente integrato con R. –

+0

Il collegamento è ora morto. – qed

2

Il pacchetto CodeDepends (CRAN, website, GitHub) sembra interessante, non ho guardato in esso però. Tra gli altri, promette

  • creazione di grafici di chiamata tra insiemi di funzioni

presumibilmente attraverso la funzione makeCallGraph().

Problemi correlati