使用 rmarkdown::render() 时,它按顺序处理文档:检查 chunk1 的语法,对其进行评估,然后移动到 chunk2,依此类推整个文档。
如何在评估任何块之前检查所有块的语法?
这会节省我的时间,因为我可以在评估耗时的块之前找到并纠正语法错误。
如果您使用
rmarkdown
使用 knitr
作为后端来渲染文档(例如渲染为 HTML 或 PDF),那么我不认为这是您可以在 knitr
“内部”执行的操作,因为它处理文档按照设计,一次一大块。
一个可能的解决方案是通过运行
knitr::purl()
来“预处理”文件以提取 R 块,然后通过像 lintr
这样的语法检查器运行该文件,但这可能不容易自动化。
抛开语法检查问题,有一些策略可以用来节省编译时间。
更明显的选择是使用
knitr
的块缓存(cache=TRUE
)。当文档处于“设计阶段”时,您可以使用 cache=
在初始块上将 knitr::opts_chunk$set(cache = TRUE)
设置为 TRUE,然后将其切换为 FALSE
以获取最终版本。 然而,我发现它是一把双刃剑 - 似乎在某些情况下对某些块的更改不会使依赖于它们的后续块的缓存无效 - 但它可能会节省您一些时间。
我有时使用的另一种方法是将繁重的计算结果或长数据库查询保存为
.RData
文件,并使用一些开关在运行+保存和加载之间切换:
```{r setup}
run_query <- TRUE
```
```{r run_and_save, eval = run_query}
data <- run_a_long_database_query()
data2 <- do_computationally_heavy_stuff_with_the_data()
save(data, data2, file = "saved_data.RData")
```
```{ r load_from_file, eval = !run_query }
load("saved_data.RData")
```
总之,
run_query
用于在运行第二个或第三个块之间切换。 这样做的优点是克服了 knitr
的缓存限制,但无可否认,有点麻烦。