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

如何在R标记中捕获内联代码块中的错误?,r,r-markdown,knitr,R,R Markdown,Knitr,我正在使用rmarkdown::render在一个循环中批量呈现大量Rmd文件,并且我需要能够获得输出,即使是那些内联代码中有错误的文件。我无法手动编辑内联代码以包含类似于try()的内容,因此需要某种编织钩子 我尝试编写一个内联knit_hook,它将捕获内联代码错误,但这不起作用,因为表达式是在传递给hook函数之前求值的 任何建议都将非常感谢 谢谢 与在常规代码中捕获它的方式相同吗 --- title: 'Hello World' --- This mistake is caught:

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

我尝试编写一个内联
knit_hook
,它将捕获内联代码错误,但这不起作用,因为表达式是在传递给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)`

我想我终于明白了。诀窍是设置
inline
evaluate.inline
钩子。下面,
evaluate.inline
是对默认函数的编辑,该函数将
try()
添加到求值中。然后,
内联
钩子测试输出类,如果是
“try error”
,则将对象
返回为.vector(不带属性):


希望其他人觉得这很有用。

谢谢您的时间。我想我的问题还不够清楚。我不是Rmd文件的作者,不需要修改其中的每个内联块。换句话说,我需要一个更具程序性的解决方案。我理解,我认为你需要在你的问题中明确这一点。您所要求的是一种通用的方法,在全局级别上中断R中的错误链。这实际上有点“危险”,因为您从Rmd获得的结果完全可能由于文档中的一两个错误而完全不可信。虽然我知道您继承了Rmd文档,但您收到错误的事实表明,您最好承担所有权和/或要求原始作者自己修复错误;我编辑了这个问题。我理解你的观点,但那不是真正的问题。并非上下文与问题相关,而是用于标记/检查学生提交的Rmd文件。我还没有任何相关经验,但R-4.0引入了
globalCallingHandlers
,这是一个功能,旨在让您对如何处理错误进行更多控制。我还没有使用4,所以还没有使用这个函数,但也许这是一个你可以进一步研究的方向。谢谢你的建议,我会研究它的。奇怪的是,似乎没有一个很好的文档记录的刀钩选项来实现这一点:/Good find!对于
try
,我通常使用
if(继承(x,“try error”)
,尽管这样应该可以。您也可以选择
v
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
})