避免每次在knitr中加载数据

时间:2014-09-21 19:18:41

标签: r knitr r-markdown

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

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

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

1 个答案:

答案 0 :(得分:7)

编织文档时,会在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 - &gt; withVisible - &gt; eval - &gt; eval - &gt;摘要   执行暂停

选项1:手动调用渲染功能

render中的rmarkdown函数可以从另一个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进行了更新,不再需要不断重建文件。可以直接在文件中运行块,并查看输出窗口。它可能会为你节省大量的时间来优化脚本,只需要节省几分钟的编译时间(通常也是获得热饮的好时机!)。

enter image description here