从knitr得到错误的追溯

时间:2014-05-03 08:55:04

标签: r knitr

如何从knitr获得更好的错误报告?

e.g。现在knitr辞职了:

Calls: knit ... lapply -> FUN -> lapply -> FUN -> rename -> <Anonymous>

当我以交互方式运行相同的代码时,R退出:

Calls: getSampleData ... lapply -> FUN -> lapply -> FUN -> rename -> <Anonymous>

这对于理解问题要好得多 - 至少我知道哪个函数引发了错误。

理想情况下,我希望还附加了traceback()。

2 个答案:

答案 0 :(得分:3)

您可以设置opts_chunk$set(error = FALSE),然后您就可以在发生错误时运行traceback()。这要求您运行 knitr in an interactive R session

答案 1 :(得分:1)

对于您实际想要向文档的阅读器显示错误的相关问题,我编写了一个包装函数,用于计算并保存knitr文档中的回溯,并替换显示它的traceback()。这是代码:

saveTraceback <- local({
  savedTraceback <- NULL
  saver <- function(e) {
    calls <- sys.calls()
    deparsed <- lapply(calls, deparse)
    deparsed <- deparsed[-length(deparsed)+0:1] # leave off last 2
    lastjunk <- max(grep("withCallingHandlers", deparsed))
    deparsed <- deparsed[-seq_len(lastjunk)]
    savedTraceback <<- deparsed
  }
  function(expr)
    withCallingHandlers(expr, error = saver)
})

traceback <- function() {
  base::traceback(environment(saveTraceback)$savedTraceback)
}

你会像这样使用它。首先显示代码而不执行它:

<<mycode,eval=FALSE>>=
f <- function() stop("this is an error")
g <- function() f()
g()
@

然后在saveTraceback()函数中执行它而不显示:

<<echo=FALSE>>=
saveTraceback({
<<mycode>>
})
@

最后拨打traceback(),这将显示类似于什么的内容 用户会在控制台中看到。