Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在呈现RMarkdown文档时修改全局环境_R_R Markdown_Knitr - Fatal编程技术网

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

在呈现RMarkdown文档时修改全局环境,r,r-markdown,knitr,R,R Markdown,Knitr,考虑这个保存在文件test.rmd中的最小RMarkdown示例: ```{r} foo <- "bar" ``` 同样,如果在全局环境中定义了foo,则将对其进行修改: > foo <- "baz" > rmarkdown::render("test.rmd") [...] Output created: test.html > foo [1] "bar" 现在,当我调用myrender(“test.rmd”)时,foo变量被导出到父环境,在本例中,导出到my

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

```{r}
foo <- "bar"
```
同样,如果在全局环境中定义了
foo
,则将对其进行修改:

> foo <- "baz"
> rmarkdown::render("test.rmd")
[...]
Output created: test.html
> foo
[1] "bar"
现在,当我调用
myrender(“test.rmd”)
时,
foo
变量被导出到父环境,在本例中,导出到
myrender
中的环境,我无法再从全局环境访问它:

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

虽然这是预期的行为,但我仍然希望
渲染
修改全局环境。我如何做到这一点呢?

让我先说一句,我认为这是一个非常糟糕的主意。渲染应该在它自己的范围内进行,最好是在它自己的R进程中进行,以避免干扰(我甚至更进一步:默认情况下这是API中的一个正确性缺陷)

但是您可以将计算环境传递给
rmarkdown::render

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

myrender OK,所以基本原理如下:当我使用缓存机制时,在文档输出之间切换会重置缓存。如果渲染需要几个小时,就像我的一些项目一样,这是非常烦人的。我正在使用的函数使用不同的名称(如*_html.rmd)复制rmd并呈现副本。这样,我有两个缓存,每种文档输出类型一个,并且不必再次渲染慢的部分,无论是创建PDF还是HTML。这仍然是一个肮脏的黑客,但我现在无法想出更好的解决方案。坦率地说,我不明白为什么需要重置缓存,我认为生成降价是将其转换为输出文档的一个单独步骤。也许我遗漏了什么,你可以问一个关于缓存问题的单独问题。我想我知道答案,但如果没有看到一个可复制的例子,我就不能肯定。谢谢
myrender <- function(f) render(f, output_format = "html_document", envir = globalenv())