如何在Rstudio Markdown中使用来自全局环境的对象

时间:2015-12-01 20:35:12

标签: r rstudio knitr

我在Stack Overflow上看过类似的问题,但几乎没有确凿的答案,当然也没有对我有用的答案。

在Markdown(Rstudio)脚本中访问和使用位于全局R环境中的对象(回归拟合,数据框,其他对象)的最简单方法是什么。

我发现令人惊讶的是,由于RStudio团队倾向于让事情变得舒适和有效,因此没有简单的解决方案。

提前致谢。

8 个答案:

答案 0 :(得分:37)

无论好坏,这种遗漏都是故意的。依赖在文档外部创建的对象会使文档的可重现性降低 - 也就是说,如果您的文档需要全局环境中的数据,那么您不能仅仅向某人(或您自己在两年内)提供文档和数据文件并让它们重新创建它本身。

出于这个原因,为了在后台执行渲染,RStudio实际上创建了一个单独的R会话来渲染文档。该背景R会话无法看到您在RStudio中看到的交互式R会话中的任何环境。

解决此问题的最佳方法是使用您用于创建全局环境内容的代码并将其移动到文档中(如果您不希望它显示在文档中,则可以使用echo = FALSE文件)。这使您的文档自包含且可重现。

如果您不能这样做,可以采取一些方法直接在全球环境中使用数据:

  1. 不要使用 Knit HTML 按钮,而是在R控制台上输入rmarkdown::render("your_doc.Rmd")。这将编织当前会话而不是后台会话。可替换地:

  2. 在呈现之前将您的全局环境保存到.Rdata文件(使用R的save函数),并在文档中将load保存。

答案 1 :(得分:1)

我自己也有同样的问题。每次重现都会花费一些时间。

我认为还有另一个答案。如果使用save.image()函数将环境保存到与标准.Rdata不同的文件,该怎么办?然后,使用load()将其恢复。

为确保使用相同的数据,请使用 工具 中的md5sum()

干杯,电话

答案 2 :(得分:1)

我想我通过在要编织的代码中显式引用包来解决了这个问题。例如,使用yarrr包,我使用data(pirates)加载了数据帧“ pirates”。在控制台和Rstudio代码块中,此方法运行良好,但使用knitr时,它遵循上述问题的模式失败。但是,如果我通过使用pirates <- yarrr::pirates创建一个对象将数据加载到内存中,则该文档随后将干净地编织为HTML。

答案 3 :(得分:1)

转到RStudio的“工具”和“全局选项”并访问“ R Markdown”选项卡,可以在“评估目录中的块”中进行选择,然后选择“文档”和R Markdown编织引擎将像普通的R代码一样访问全局环境。希望这对那些搜索此信息的人有所帮助!

答案 4 :(得分:1)

嗯,就我而言,我找到了以下解决方案:

(1)将全球环境文件保存在具有.Rmd文件的同一文件夹中的.Rdata文件中。 (您只需要单击“全球环境”面板上的Disquet图片)

(2)在Rmarkdown脚本中编写以下代码:

load(file = "filename.RData") #  it load the file that you saved before

停止痛苦。

答案 5 :(得分:0)

您可以按如下所示在所需的环境中加载脚本:

```{r, include=FALSE}
source("your-script.R", local = knitr::knit_global())
# or sys.source("your-script.R", envir = knitr::knit_global())
```

R Markdown文档中的下一步,您可以使用在这些脚本中创建的对象(例如,数据对象或函数)。

https://bookdown.org/yihui/rmarkdown-cookbook/source-script.html

答案 6 :(得分:0)

我还没有看到的一个选项是使用参数。

This chapter 通过一个简单的例子来说明如何做到这一点。

答案 7 :(得分:0)

该线程很旧,但以防万一有人仍在寻找解决方案(就像我一样):

您可以将 envir 参数传递给 render()(或 knit() 函数),以便它可以从调用它的环境中访问对象。

rmarkdown::render(
      input = input_rmd,
      output_file = output_file,
      envir = parent.frame()
    )