我刚刚开始测试rmarkDown用于创建数据集的代码书,我对使用cache = TRUE
时的行为感到困惑。我正在使用Rstudio 1.1.463进行运行。rmarkDown_1.11,knitr_1.21和tidyverse_1.2.1。
使用以下示例代码,其中包括一些我感兴趣的文档和块选项,附加了我通常使用的所有库(请注意,我在几个地方添加了"在几个地方进行适当的格式化,:
---
title: "Test"
date: 2019-03-11
output:
html_document
---
```{r header, echo= FALSE, include=FALSE, cache = TRUE, warning= FALSE}
attach(mtcars)
library(sf)
library(tidyverse)
library(knitr)
library(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文档上明确library(knitr)
,因为我认为这是"编织"文档的关键软件包...如果我删除它,则找不到opts_chunk
。<<<<<<<<<<
感谢您的任何帮助!
我相信cache = TRUE
试图缓存块中创建的R对象。您的第一个块不仅仅是创建对象:attach
和require
调用每个都有副作用:修改搜索列表,加载软件包等。这些副作用并没有缓存,但是您的文档需要工作:由于knitr
认为没有理由再次运行块您的文档在第二次运行中失败。
当块进行较长的慢速计算以生成数据集以供以后绘制或汇总时,通常使用cache = TRUE
,因为随后的运行可以跳过计算的慢部分。
您问为什么需要require(knitr)
。严格来说,不需要:您可以使用knitr::opts_chunk
。但更重要的是,想法是R Markdown文档是独立r会话的描述。是的,您需要knitr
对其进行处理,但是它应该给出相同的结果,就像您在空的会话中单独运行代码一样。(这不是完全正确的:knitr
的块选项和挂钩可以修改行为,但这是正在发生的事情的方便心理模型。)
库不耗时。我通常会在两个不同的块中从数据中拉开库和设置,最后一个 cache=TRUE
。