考虑这个最小的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 环境。我该如何实现?
答案 0 :(得分:4)
让我在此开头加上一点,我认为这是一个非常糟糕的主意。渲染应该在自己的范围内进行,并且最好在自己的R流程中进行,以完全避免干扰(我什至更进一步:默认情况下,此方法有效是API中的正确性缺陷)。
但是您可以将评估环境传递给rmarkdown::render
:
myrender <- function(f) render(f, output_format = "html_document", envir = globalenv())