我刚刚开始测试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
kable
,descr
均抛出“找不到功能”错误如果显式调用父包/数据框,这些问题将消失。如果cache = FALSE
没有问题。
为什么cache = TRUE
会触发此行为?对于本代码书,我想到了附加最终数据集,然后为每个变量提供一些摘要的方法。我还想生成几个包含许多变量的sf
映射。我想到要处理这样的标题块中的所有内容,然后调用整个文档中的各个位。我应该换个角度吗?
顺便说一句,我不太理解为什么有必要在Rmarkdown文档上显式require(knitr)
,因为我认为这是“编织”文档的关键包……如果我删除它,{{ 1}}找不到。
感谢您的帮助!
答案 0 :(得分:3)
我相信cache = TRUE
试图缓存以块形式创建的R对象。您的第一个块所做的不只是创建对象,还有很多事情:attach
和require
调用各自都有副作用:修改搜索列表,加载程序包等。这些副作用不会被缓存,但是它们会被缓存需要文档才能工作:由于knitr
认为没有理由再次运行该块,因此文档在第二次运行中失败。
通常,当块执行长时间的慢速计算时,会使用cache = TRUE
来生成数据集,以便以后进行绘图或汇总,因为随后的运行会跳过计算的慢速部分。
您问为什么需要require(knitr)
。严格来说,这不是必需的:您可以改用knitr::opts_chunk
。但更重要的是,该想法是R Markdown文档是对独立R会话的描述。是的,您需要knitr
来处理它,但是其结果应该与您只是在空会话中单独运行代码一样。 (事实并非如此:knitr
的块选项和钩子会稍微改变行为,但这是正在发生的事情的便捷的心理模型。)