考虑这个保存在文件 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())
关于r - 渲染 RMarkdown 文档时修改全局环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58644441/