如何在 R Markdown 中捕获内联代码块中的错误?

How do I catch errors in inline code chunk in R Markdown?

我正在使用 rmarkdown::render 在一个循环中批量渲染多个 Rmd 文件,我需要能够获得输出,即使对于那些在内联代码中有错误的文件也是如此。我无法手动编辑内联代码以包含 try() 之类的内容,因此需要某种编织钩子。

我尝试编写一个内联 knit_hook 来捕获内联代码错误,但这不起作用,因为表达式在传递给挂钩函数之前已被求值。

如有任何建议,我们将不胜感激。

谢谢!

与您在常规代码中捕获它的方式相同吗?

---
title: 'Hello World'
---

This mistake is caught: `r tryCatch(stop("foo"), error = function(e) "caught!")`

This mistake is silent: `r try(stop("foo"), silent = TRUE)`

我想我最终明白了这一点。诀窍是同时设置 inlineevaluate.inline 挂钩。下面,evaluate.inline 是对默认函数的编辑,将 try() 添加到评估中。 inline 钩子然后测试输出 class,如果它是 "try-error",returns 对象 as.vector(没有属性):

knitr::knit_hooks$set(
  evaluate.inline = function (code, envir = knit_global()) {
    v = try(eval(xfun::parse_only(code), envir = envir))
    knitr::knit_print(v, inline = TRUE, options = knitr::opts_chunk$get())
  },
  inline = function(x) {
  if (any(class(x) == "try-error")) {
    as.vector(x)
  } else x
})

希望其他人觉得这有用。