【问题标题】:Avoid loading data every time in knitr避免每次在 knitr 中加载数据
【发布时间】:2014-09-21 19:18:41
【问题描述】:

我正在使用 knitr 创建一个文档,我发现每次在开发过程中解析文档时从磁盘重新加载数据很乏味。我已经将该数据文件子集化以用于开发以缩短加载时间。我也将 knitr 缓存设置为开启。

我尝试使用<<- 将数据分配给全局环境,并将existswhere=globalenv() 一起使用,但这不起作用。

有人知道如何在 knitr 中使用环境中的预加载数据或有其他想法来加快开发速度吗?

【问题讨论】:

    标签: r knitr r-markdown


    【解决方案1】:

    当一个文档被编织时,在 R 中创建了一个新环境,因此全局环境中的任何设置都不会传递给文档。但是,这是故意这样做的,因为在全局环境中意外引用对象很容易破坏可重现的分析,因此每次创建一个干净的会话意味着 RMarkdown 文件独立运行,而不管全局环境设置如何。

    如果您确实有一个可以证明预加载数据的用例,那么您可以做一些事情。

    示例数据

    首先,我创建了一个名为“RenderTest.Rmd”的最小 Rmd 文件:

    title: "Render"
    author: "Michael Harper"
    date: "7 November 2017"
    output: pdf_document
    ---
    
    ```{r cars}
    summary(cars2)
    ```
    

    在此示例中,cars2 是我从全局会话中引用的一组数据。使用 RStudio 中的“Knit”命令运行它,这将返回以下错误:

    摘要中的错误(汽车):找不到对象“cars2”:... withCallignHandlers -> withVisible -> eval -> eval -> 摘要 执行停止

    方案一:手动调用渲染函数

    rmarkdown 中的 render 函数可以从另一个 R 脚本调用。默认情况下,这不会为脚本运行创建新环境,因此您可以使用已加载的任何参数。举个例子:

    # Build file
    library(rmarkdown)
    
    cars2<- cars
    render("RenderTest.Rmd")
    

    但是,我会小心这样做。首先,使用 RMarkdown 的好处是它使脚本的重现性非常容易。一旦您开始使用外部脚本,复制起来就会变得更加复杂,因为所有设置都不包含在文件中。

    选项 2:将数据保存到 R 对象

    如果您有一些需要时间运行的分析,您可以将分析结果保存为 R 对象,然后您可以将数据的最终版本重新加载到会话中。使用我上面的例子:

    ```{r dataProcess, cache = TRUE}
    cars2 <- cars
    save(cars2, "carsData.RData") # saves the 'cars2' dataset
    ```
    and then we can just reload the data into the session:
    
    ```{r}
    load("carsData.RData") # reloads the 'cars2' dataset
    ```
    

    我更喜欢这种技术。块dataProcess 被缓存,因此仅在对代码进行更改时运行。结果保存到文件中,然后由下一个块加载。数据仍然需要加载到会话中,但是如果您需要进行任何数据清理,可以保存最终的数据集。

    选项 3:减少构建文件的频率

    随着过去几年对 RStudio 的更新,不再需要不断地重新构建文件。块可以直接在文件中运行,并查看输出窗口。它可能会为您节省大量尝试优化脚本的时间,只节省几分钟的编译时间(这通常是喝一杯热饮的好时机!)。

    【讨论】:

    • 这是一个很好的答案。至少在我正在运行的 R 4.0.3 版本中,对 save 的调用需要指定 file 参数:save(cars2, file = "carsData.RData")
    • 另外,对于未来的读者,您可能需要考虑另存为 .rds 文件,请参阅此处的讨论:stackoverflow.com/questions/19967478/…
    猜你喜欢
    • 2021-12-16
    • 1970-01-01
    • 2021-03-21
    • 2023-03-12
    • 1970-01-01
    • 2019-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多