2011-01-28 13 views
16

Un colega estaba mirando gráficos de llamadas recientemente y quería ver qué se llamaba qué. Estamos ordenados que con la red alimentaria de mvbutils, pero me preguntaba sobre la mejor manera de crear un decorador (en la jerga pitón) en R. Así lo hice:Escribiendo un decorador para funciones R

instrument=function(z){ 
    force(z) 
    n=deparse(substitute(z)) # get the name 
    f=function(...){ 
    cat("calling ", n,"\n") 
    x=z(...) 
    cat("done\n") 
    return(x) 
    } 
    return(f) 
} 

Esto me permite hacer:

> foo=function(x,y){x+y} 
> foo(1,2) 
[1] 3 

y ahora puedo realizar la función de registro en sí envolviéndolo:

> foo=instrument(foo) 
> foo(1,2) 
calling foo 
done 
[1] 3 

se ha hecho esto antes, en un paquete de decir, y me he perdido ningún trampas que rompan mi manera de hacer esto?

+1

Pregunta justa, audiencia equivocada. IMNSHO claramente necesita preguntar esto en 'r-devel'. –

+3

Mientras Gabor esté en la audiencia, es la audiencia correcta. – Spacedman

+2

Gran pregunta. Aunque la respuesta ha sido aceptada, me gustaría ver una más canónica/enciclopédica :) – fmark

Respuesta

9

La función trace en R hace eso. Ver ?trace.

Cuestiones relacionadas