渲染 RMarkdown 文档时修改全局环境

Modify global environment when rendering RMarkdown document

考虑这个保存在文件 test.rmd:

中的最小 RMarkdown 示例
```{r}
foo <- "bar"
```

如果您使用 rmarkdown::render("test.rmd") 呈现此文件,将在您的全局环境中找到对象 foo

> foo
Error: object 'foo' not found
> rmarkdown::render("test.rmd")
[...]
Output created: test.html
> foo
[1] "bar"
> 

同理,如果在全局环境中定义了foo,则修改为:

> foo <- "baz"
> rmarkdown::render("test.rmd")
[...]
Output created: test.html
> foo
[1] "bar"

到目前为止,还不错。

但是,出于我自己的原因,我想围绕 render() 包装另一个函数,例如

myrender <- function(f) render(f, output_format="html_document")

现在,当我调用myrender("test.rmd")时,foo变量被导出到父环境,在本例中,导出到myrender内的环境,我无法再访问它来自全球环境:

> myrender("test.rmd")
[...]
Output created: test.html
> foo
Error: object 'foo' not found

虽然这是预期的行为,但我仍然希望 render 修改 global 环境。我该如何实现?

让我先声明一下,我认为这是一个非常糟糕的主意。渲染应该发生在它自己的范围内,最好是它自己的 R 进程,正是为了避免干扰(我什至更进一步:默认情况下它工作的事实是 API 中的正确性缺陷)。

但您可以将评估环境传递给 rmarkdown::render:

myrender <- function(f) render(f, output_format = "html_document", envir = globalenv())