当一个文档被编织时,在 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 的更新,不再需要不断地重新构建文件。块可以直接在文件中运行,并查看输出窗口。它可能会为您节省大量尝试优化脚本的时间,只节省几分钟的编译时间(这通常是喝一杯热饮的好时机!)。