2011-01-25 17 views
25

Me han dado una gran cantidad de código R monolítico mal formateado con muchas funciones, y me gustaría averiguar qué funciones llaman qué funciones.Generando un gráfico de llamadas en R

Pensé que podría usar el material de @callGraph de roxygen, pero a) el código debe estar en un paquete, lo que será un dolor de cabeza con este código, yb) ni siquiera parece funcionar cuando corro en un simple paquete mío. Veo una publicación de uno de los autores de Roxygen que dice que la generación del gráfico de llamadas está desactivada debido a la dependencia de Rgraphviz, pero el código está ahí. De todas formas.

Cualquier persona tiene una forma mejor de resolver rápidamente las llamadas foo bar, baz y qux, y que qux llama a quux?

Edición: Las soluciones basadas en el sistema de creación de perfiles de R son geniales, suponiendo que pueda ejecutar el código ... La mitad de las cosas en los archivos no se ejecutan, y no sé lo que hace ... Estático el análisis es demasiado para esperar, supongo.

Edición 2: el material del gráfico de llamadas de Roxygen parece hacer un análisis estático, basado en el descenso recursivo de la expresión de la función y la comprobación de is.callable. Sería maravilloso poder ejecutar esto en cualquier función ... Puedo jugar con esto mañana ...

Respuesta

17

Puede consultar la función 'foodweb' del paquete 'mvbutils' en CRAN. Aquí hay un enlace a un artículo que describe su uso:

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

responsabilidad: este es mi sitio web y que escribió ese artículo.

+0

Estaba ponderando la idea de escribir una función que hiciera algo como esto. Y eso fue justo sobre el momento en que publicaste la publicación del blog anterior. ¿Grandes mentes piensan igual? :) –

+1

Más o menos exactamente lo que estaba buscando. Ahora, para convertir la salida en formato de punto, o tal vez cargarla en otro paquete de gráfico R ... – Spacedman

3

¿Te ayudaría profr? A partir de la documentación:

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

No es exactamente lo que está después, pero usted puede ser capaz de adaptarlo a sus necesidades.

1

No lo he usado, pero un vistazo rápido al paquete proftools indica que puede hacerlo. Primero deberá ejecutar Rprof y luego usar proftools para analizar la salida. Creo que quieres la función plotProfileCallGraph().

3

Además de proftools y profr, existe la secuencia de comandos Perl de Romain en la R Wiki. Combinado con graphviz, hace gráficos (con los bordes ponderados) - vea here para más.

+0

Agradable. ¿Tiene que ir en el directorio R bin? Parece ejecutarse solo como un script ./Rprof2dot perl, y no puedo ver ninguna dependencia R ... – Spacedman

+0

Cuando utilicé el script perl, lo guardé en una ruta local o en el directorio actual. Todavía no está completamente integrado con R. –

+0

El enlace está ahora muerto. – qed

2

El CodeDepends paquete (CRAN, website, GitHub) parece interesante, no he mirado en él sin embargo. Entre otros, que promete

  • la creación de gráficos de llamadas entre conjuntos de funciones

presumiblemente a través de la función makeCallGraph().

Cuestiones relacionadas