避免每次在knitr中加载数据

Dan*_*iel 10 r knitr r-markdown

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

我尝试使用<<-和使用existswith 将数据分配给全局环境where=globalenv(),但这不起作用.

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

Mic*_*per 8

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

如果您确实有一个用于预加载数据的用例,那么您可以执行一些操作.

示例数据

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

title: "Render"
author: "Michael Harper"
date: "7 November 2017"
output: pdf_document
---

```{r cars}
summary(cars2)
```
Run Code Online (Sandbox Code Playgroud)

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

摘要错误(汽车):未找到对象'cars2':... withCallignHandlers - > withVisible - > eval - > eval - > summary执行暂停

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

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

# Build file
library(rmarkdown)

cars2<- cars
render("RenderTest.Rmd")
Run Code Online (Sandbox Code Playgroud)

但是,我会小心这样做.首先,使用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
```
Run Code Online (Sandbox Code Playgroud)

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

选项3:不太频繁地构建文件

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

在此输入图像描述