如何在 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)`
我想我最终明白了这一点。诀窍是同时设置 inline
和 evaluate.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
})
希望其他人觉得这有用。
我正在使用 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)`
我想我最终明白了这一点。诀窍是同时设置 inline
和 evaluate.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
})
希望其他人觉得这有用。