3

如果我有一些相互关联的函数,那么跟踪它们的路径会很有用。也就是说,trace每次 R 进入或离开其中一个函数时,都会使用该函数给出一条消息。例如,

f <- function() g()
g <- function() h()
h <- function()
{
 if(runif(1) > 0.3) g() else 99
}

trace_my_fns <- function()
{
  fn_names <- c("f", "g", "h")
  invisible(trace(
    fn_names,
    tracer = quote(0),
    exit   = quote(0),
    where  = globalenv()
  ))
}

trace_my_fns()
set.seed(4)
f()

完成此跟踪后,我需要取消跟踪它们。

untrace_my_fns <- function()
{
  fn_names <- c("f", "g", "h")
  invisible(trace(
    fn_names,
    where = globalenv()
  ))
}
untrace_my_fns()

出于某种原因,这并不能正确地取消跟踪功能。要看到这一点,请看一下

f
body(f)

如果我直接在每个函数上调用 untrace,例如untrace(f)在命令行中,它就可以工作。我应该如何创建一个函数来一次取消跟踪我的所有函数?

4

1 回答 1

6

好吧,改为:

untrace_my_fns <- function()
{
  fn_names <- c("f", "g", "h")
  invisible(untrace(
    fn_names,
    where = globalenv()
  ))
}

untrace_my_fns()
set.seed(4)
f() # no more tracing...

...因为你打电话trace而不是untrace!

于 2012-04-12T22:00:12.317 回答