【问题标题】:How to use objects from global environment in Rstudio Markdown如何在 Rstudio Markdown 中使用来自全局环境的对象
【发布时间】:2016-03-05 22:03:44
【问题描述】:

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

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

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

提前致谢。

【问题讨论】:

  • 您如何处理您的 RMarkdown 文件?通过按下“knit HTML”按钮,或者在某处运行knit 命令?
  • 我推送“编织 HTML”——这可能是问题吗?
  • 是的。看看下面的答案

标签: r rstudio knitr


【解决方案1】:

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

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

解决此问题的最佳方法是获取用于创建全局环境内容的代码并将其移动到文档中(如果您不希望它出现在文档中,可以使用 echo = FALSE )。这使您的文档独立且可复制。

如果你不能这样做,你可以采取一些方法来直接使用全局环境中的数据:

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

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

【讨论】:

  • 也可以使用knitr::knit("your_doc.Rmd")。 R Studio“Knit HTML”按钮可能使用 rmarkdown 或 knitr 引擎,具体取决于个人偏好设置,在某些情况下它们的行为可能略有不同
  • 但是如果我不想每次“编织”时都重新运行所有代码怎么办?因为我的数据集很大(几百万行,>200 个变量),所以重新运行代码将非常耗时。降价可以跳过重新重新运行一些块吗?我还没有找到这样的说法,即。
  • 感谢亚当。我有一些问题,但找到两种方法会有所帮助。 1.将 knitr::opts_chunk$set(cache =TRUE), 添加到您的 rmarkdown 文件并运行它。 2. 在 r 控制台运行 cammand rmarkdown::render("your_file.Rmd").
  • 在块中使用选项 eval=FALSE。您必须保存编织时需要的任何内容,并将其加载到运行渲染的 R 会话中。
  • @VictorZurkowski 我和 Adam Robinsson 的情况一样。我有大型数据集,重建速度很慢。它们的文件大小也很大。因此,将其中几个导出到磁盘只是为了避免这个问题也是令人望而却步的。我会尝试缓存 =TRUE 选项。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    (1) 将您的全球环境保存在一个 .Rdata 文件中,该文件与您的 .Rmd 文件所在的文件夹相同。 (你只需要点击“全球环境”面板上的disquet图片)

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

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

    并停止痛苦。

    【讨论】:

      【解决方案4】:

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

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

      为确保您使用的是相同的数据,请使用 tools 中的 md5sum()

      干杯,绳子

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            【解决方案7】:

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

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

            【讨论】:

              【解决方案8】:

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

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

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2019-12-16
                • 2016-03-07
                • 1970-01-01
                • 2018-12-23
                • 2021-03-16
                • 2018-10-27
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多