为R函数编写装饰器

Spa*_*man 17 r

最近一位同事正在研究呼叫图,并希望看到什么叫做什么.我们用mvbutils的foodweb对它进行了排序,但我想知道如何最好地在R中创建一个装饰器(用python说话).所以我这样做了:

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)
}
Run Code Online (Sandbox Code Playgroud)

这让我做:

> foo=function(x,y){x+y}
> foo(1,2)
[1] 3
Run Code Online (Sandbox Code Playgroud)

现在我可以通过包装它来使函数自己记录:

> foo=instrument(foo)
> foo(1,2)
calling  foo
done
[1] 3
Run Code Online (Sandbox Code Playgroud)

以前做过这件事,在一个包裹中说,并且我错过了任何会破坏我这样做的陷阱吗?

G. *_*eck 10

traceR中的功能就是这样.见?trace.