脚本中的库在直接调用 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')\"")
(如果你不止一次调用它,我可能会把它放在一个函数中)。
假设我有以下 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')\"")
(如果你不止一次调用它,我可能会把它放在一个函数中)。