在RMarkdown中缓存实际上缓存了什么?附件错误

时间:2019-03-11 02:07:34

标签: r rstudio r-markdown

我刚刚开始测试Rmarkdown以用于创建数据集的密码本,并且我对使用cache = TRUE时的行为感到非常困惑。我正在使用RStudio 1.1.463运行它。 rmarkdown_1.11,knitr_1.21和tidyverse_1.2.1。

采用以下示例代码,其中包含我感兴趣的一些doc和chunk选项,并附加了我通常使用的所有库(请注意,我在几个地方添加了“ |”以在SO上进行适当的格式化):< / p>

---
title: "Test"
date: 2019-03-11
output: 
  html_document
---


```{r header, echo= FALSE, include=FALSE, cache = TRUE, warning= FALSE}

attach(mtcars)

require(sf)
require(tidyverse)
require(knitr)
require(summarytools)

opts_chunk$set(echo = FALSE, error = TRUE)

|```

# mtcars dataset heading

## map of car purchases

## cyl variable

```{r} 

kable(descr(cyl))

|```

当我第一次点击RStudio上的“编织”按钮时(没有现有的缓存文件夹),结果是预期的。如果再次点击“编织”,则会发生以下情况:

    找不到
  • cyl
  • kabledescr均抛出“找不到功能”错误

如果显式调用父包/数据框,这些问题将消失。如果cache = FALSE没有问题。

为什么cache = TRUE会触发此行为?对于本代码书,我想到了附加最终数据集,然后为每个变量提供一些摘要的方法。我还想生成几个包含许多变量的sf映射。我想到要处理这样的标题块中的所有内容,然后调用整个文档中的各个位。我应该换个角度吗?

顺便说一句,我不太理解为什么有必要在Rmarkdown文档上显式require(knitr),因为我认为这是“编织”文档的关键包……如果我删除它,{{ 1}}找不到。

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

我相信cache = TRUE试图缓存以块形式创建的R对象。您的第一个块所做的不只是创建对象,还有很多事情:attachrequire调用各自都有副作用:修改搜索列表,加载程序包等。这些副作用不会被缓存,但是它们会被缓存需要文档才能工作:由于knitr认为没有理由再次运行该块,因此文档在第二次运行中失败。

通常,当块执行长时间的慢速计算时,会使用cache = TRUE来生成数据集,以便以后进行绘图或汇总,因为随后的运行会跳过计算的慢速部分。

您问为什么需要require(knitr)。严格来说,这不是必需的:您可以改用knitr::opts_chunk。但更重要的是,该想法是R Markdown文档是对独立R会话的描述。是的,您需要knitr来处理它,但是其结果应该与您只是在空会话中单独运行代码一样。 (事实并非如此:knitr的块选项和钩子会稍微改变行为,但这是正在发生的事情的便捷的心理模型。)