如何访问正在跟踪的函数的返回值

时间:2014-07-10 22:03:12

标签: r debugging trace

有没有办法访问由指定为exit param的函数跟踪的函数的返回值?这听起来很难理解,但我无法在不丢失信息的情况下简化问题。所以这是一个简单的例子。

我们有一个简单的功能

add10 <- function(a){
  a + 10
}

当调用add10退出时,我们想要调用的一些函数。

trace.exit() <- function(){
...
}

跟踪的设置方式如下。

trace(add10, exit=trace.exit)

我们打电话给add10

add10(5)

据我所知,trace.exit将在add10完成执行后调用。有没有办法在add10内访问trace.exit的返回值?

我觉得应该有。但是玩sys.frames并浏览环境我无法得到它。

这样做的原因是希望捕获对某些函数的所有调用并返回它们给出的值。

UPD 使用包装器或类似的东西的解决方案很不错,但是trace已经实现了装饰器模式,所以我的问题是从trace访问返回值,而不是解决R.装饰者的问题。

1 个答案:

答案 0 :(得分:4)

为什么不使用显式地将返回值赋值给局部变量的包装器:

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)

一个缺点是包装器总是返回不可见的结果 - 这就是为什么上面的例子只打印格式化的输出。