脚本中的库在直接调用 render 时会干扰 Rmd

Libraries in script interfere with Rmd when calling render directly

假设我有以下 Rmd 文件,名为 render-issues.Rmd:

---
title: "Render Issues"
output: html_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```

```{r lib}
library(dplyr)
```

```{r clash}
mtcars %>% summarize(n = n())
```

在 R-Studio 中按下 knit 按钮时,一切正常。

如果我尝试“手动”呈现此文档,即通过在脚本中调用 rmarkdown::render,我可能会失败:

library(dplyr)
library(rmarkdown)
library(Hmisc) ## note the conflict of summarize

render("render_issues.Rmd")

这不会呈现,因为 summarize 现在指的是 Hmisc::summarize

因此,我想我可以提供 envir 以确保我的 Rmd 文件不会被渲染脚本中的库干扰

### Use `parent` to simulate a fresh R session with the 
### standard libs loaded
render("render_issues.Rmd", 
       envir = new.env(parent = as.environment("package:stats")))

但是,这也不起作用,因为现在 dplyr 没有(重新)加载,因此无法找到函数。显然,library 会检查整个搜索路径,而不管我的环境选择如何。

那么从脚本呈现报告的规范方式是什么?总的来说,我希望渲染过程完全不受调用脚本的干扰。如突出显示的那样,是生成新 R 会话的唯一解决方案吗?

是的,规范的方法是生成一个新的 R 会话。

您也可以玩 whack-a-mole 并一次解决一个冲突,方法是将

summarize <- dplyr::summarize

以及各个 Rmd 文件(或脚本)中的类似修正,但我建议在干净的会话中使用 运行。 bookdown 章节中列出的方法不是唯一的方法,您可以使用基本 R 函数来执行此操作,例如

system("Rscript -e \"rmarkdown::render('render_issues.Rmd')\"")

(如果你不止一次调用它,我可能会把它放在一个函数中)。