如何在knitr遇错时终止运行但保留已生成的部分输出
解决knitr遇到错误时终止并保留到错误处的输出问题
要实现knitr执行到错误处即停止,同时保留到该位置的输出(含错误信息),核心是利用knitr的错误钩子(error hook),在捕获错误信息后输出并立即终止编译流程。
默认情况下,knitr::opts_chunk$set(error = TRUE)会让knitr输出错误后继续执行后续内容;error = FALSE则直接终止且不生成任何到错误处的输出。我们需要自定义钩子,在输出错误信息后调用knitr::knit_exit()终止编译。
具体实现
- 定义错误钩子函数:捕获错误信息,以代码块格式输出,然后调用
knit_exit()终止编译。 - 开启
error = TRUE,让knitr将错误信息传递给钩子处理。
示例代码:
# 配置knitr选项与错误钩子 knitr::opts_chunk$set(error = TRUE) knitr::knit_hooks$set(error = function(x, options) { # 将错误信息格式化为代码块输出 cat(paste0("\n```\n", x, "\n```\n")) # 立即终止knit流程 knitr::knit_exit() # 返回空字符串避免重复输出 return("") }) # 测试编译流程 knitr::knit(output = stdout(), text = " ```{r} 1 + 1
stop('Test')
This text should not be in the output.
2 + 2
")
### 输出效果 编译后会输出前两个代码块,第二个代码块的错误信息会被正常输出,后续的文本和第三个代码块不会被处理,完全符合需求:
1 + 1
## [1] 2
stop('Test')
Error in eval(expr, envir, enclos): Test
### 原理说明 - `knit_hooks$set(error = ...)`会覆盖knitr默认的错误处理逻辑,当代码块出错时,钩子函数会被触发。 - 在钩子中输出错误信息后调用`knit_exit()`,会直接终止knitr的编译流程,后续的所有内容(文本、代码块)都不会被处理。 - `return("")`是为了避免knitr输出默认的错误信息,确保只输出我们格式化后的内容。 内容的提问来源于stack exchange,提问作者akraf
相关产品推荐
相关产品推荐

