呈现RMarkdown文档时修改全局环境

时间:2019-10-31 13:30:16

标签: r r-markdown knitr

考虑这个最小的RMarkdown示例,该示例保存在文件test.rmd中:

```{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 环境。我该如何实现?

1 个答案:

答案 0 :(得分:4)

让我在此开头加上一点,我认为这是一个非常糟糕的主意。渲染应该在自己的范围内进行,并且最好在自己的R流程中进行,以完全避免干扰(我什至更进一步:默认情况下,此方法有效是API中的正确性缺陷)。

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

myrender <- function(f) render(f, output_format = "html_document", envir = globalenv())
相关问题