debugging - 如何取消跟踪多个函数

标签 debugging r trace

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

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),它就可以工作。我应该如何创建一个函数来一次取消跟踪我的所有函数?

最佳答案

好吧,改成:

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!

关于debugging - 如何取消跟踪多个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10132365/

相关文章:

swift - CGPoint、NSTimeInterval 未在调试器 View 中显示值

r - 使用R-当值重复少于3次时删除行

r - 创建一个用字母写的数字序列

r - 如果 rbind.fill 始终返回 null,如何将我的列表放入数据帧?

c# - 我可以关闭对我的代码引用的单个程序集的跟踪吗?

trace - 将 "trace"个连续点转换为贝塞尔曲线的算法

windows - 是否可以在进程之间跟踪 PostMessage?

debugging - 如何在 Clojure 中跟踪代码执行?

debugging - lldb watchpoint打印值并自动继续

javascript - 在 Visual Studio 中调试 JavaScript 时出现 "No symbols loaded for the current document"