【问题标题】:get traceback from knitr on error错误时从 knitr 获取回溯
【发布时间】:2014-05-03 08:55:04
【问题描述】:

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

例如现在 knitr 退出:

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

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

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

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

理想情况下,我还希望附加相当于 traceback() 的功能。

【问题讨论】:

  • 听起来像是一个功能请求。我认为一辉确实关注 SO,但我也认为可能有更好的方法让他眼前一亮。

标签: r knitr


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    对于您实际希望向文档阅读者显示错误的相关问题,我编写了一个包装函数,该函数计算并保存 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(),它会显示类似于 用户会在控制台中看到。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-01
      • 2012-05-25
      • 2015-09-16
      • 2011-05-16
      • 1970-01-01
      • 2017-08-31
      • 2020-12-12
      • 1970-01-01
      相关资源
      最近更新 更多