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

How to use objects from global environment in Rstudio Markdown

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

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

鉴于 RStudio 团队倾向于使事情变得舒适和有效,我发现没有简单的解决方案对此感到惊讶。

提前致谢。

无论好坏,这个遗漏都是有意的。依赖于在文档外部创建的对象会使您的文档的可复制性降低——也就是说,如果您的文档需要全局环境中的数据,您不能只给某人(或两年后的您自己)文档和数据文件并让他们重新创建它自己。

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

解决此问题的最佳方法是将用于创建全局环境内容的代码移至文档中(如果不想显示,可以使用 echo = FALSE在文档中)。这使您的文档独立且可复制。

如果您做不到,可以采用以下几种方法直接使用全局环境中的数据:

  1. 不要使用 Knit HTML 按钮,而是在 R 控制台键入 rmarkdown::render("your_doc.Rmd")。这将在当前会话而不是后台会话中编织。或者:

  2. 在渲染之前将全局环境保存到 .Rdata 文件(在文档中使用 R 的 save function), and load

我自己也有同样的问题。有些东西每次重现都非常耗时。

我认为可能还有其他答案。如果您使用 save.image() 函数将环境保存到与标准 .Rdata 不同的文件中,会怎样?然后,用 load().

把它带回来

为确保您使用相同的数据,请使用 工具.

中的 md5sum()

Cord,干杯

我想我通过在编写的代码中明确引用包解决了这个问题。例如,使用 yarrr 包,我使用 data(pirates) 加载数据帧 "pirates"。这在控制台和 Rstudio 代码块中运行良好,但对于 knitr,它按照上述问题中的模式失败了。但是,如果我通过使用 pirates <- yarrr::pirates 创建一个对象将数据加载到内存中,然后文档会干净地编织成 HTML.

前往 RStudio 的 'Tools' 和 'Global options' 并访问 'R Markdown' 选项卡,您可以在 'Evaluate chunks in directory' 中制作 selection,那里 select 选项 'Documents' 和 R Markdown 编织引擎将像普通 R 代码一样访问全局环境。希望这对搜索此信息的人有所帮助!

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

(1) 将您的全局环境保存在您拥有 .Rmd 文件的同一文件夹内的 .Rdata 文件中。 (你只需要点击"Global Environmental"面板上的disquest图片)

(2) 在你的Rmarkdown脚本中写入如下代码:

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

并停止痛苦。

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

```{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

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

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

该线程是旧的,但如果有人仍在寻找解决方案(就像我一样):

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

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