是否有任何方法可以访问由指定为exit param的函数跟踪的函数的返回值以进行跟踪?这听起来很难理解,但我无法在不丢失信息的情况下简化问题.所以这是一个简单的例子.
我们有一个简单的功能
add10 <- function(a){
a + 10
}
Run Code Online (Sandbox Code Playgroud)
还有一些我们想要在调用add10时调用的函数退出.
trace.exit() <- function(){
...
}
Run Code Online (Sandbox Code Playgroud)
跟踪设置方式如下.
trace(add10, exit=trace.exit)
Run Code Online (Sandbox Code Playgroud)
我们打电话给add10
add10(5)
Run Code Online (Sandbox Code Playgroud)
据我所知,trace.exit将在add10完成执行后调用.有没有办法获取add10里面的返回值trace.exit?
我觉得应该有.但是玩耍sys.frames并环顾环境我无法得到它.
这样做的原因是希望捕获对某些函数的所有调用并返回它们给出的值.
UPD解决方案与包装器或类似的东西很好,但trace已经实现了装饰器模式,所以我的问题是关于访问返回值trace,而不是解决R中装饰器的问题.
为什么不使用一个包装器将返回值显式分配给局部变量:
add10 <- function(a){
a + 10
}
wrap <- function(f) { function(...) { ..ret <- f(...) } }
add10_wrap <- wrap(add10)
trace.exit <- function() {
cat(sprintf("Return value: %s\n", sys.frame(-1)$..ret))
}
trace(add10_wrap, exit=trace.exit)
add10_wrap(5)
Run Code Online (Sandbox Code Playgroud)
一个缺点是包装器总是返回不可见的结果——这就是为什么上面的例子只打印格式化的输出。