如何从knitr获得更好的错误报告?
e.g。现在knitr辞职了:
Calls: knit ... lapply -> FUN -> lapply -> FUN -> rename -> <Anonymous>
当我以交互方式运行相同的代码时,R退出:
Calls: getSampleData ... lapply -> FUN -> lapply -> FUN -> rename -> <Anonymous>
这对于理解问题要好得多 - 至少我知道哪个函数引发了错误。
理想情况下,我希望还附加了traceback()。
答案 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()
,这将显示类似于什么的内容
用户会在控制台中看到。