【问题标题】:What does cache actually cache in RMarkdown? Errors in attachment缓存在 RMarkdown 中实际缓存了什么?附件中的错误
【发布时间】:2019-03-11 02:07:34
【问题描述】:

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

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

---
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 上的 Knit 按钮时(没有现有的缓存文件夹),结果符合预期。如果我再次点击 Knit,会发生以下情况:

  • 找不到cyl
  • kabledescr 都抛出“找不到函数”错误

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

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

顺便说一句,我不太明白为什么有必要在 Rmarkdown 文档上显式地library(knitr),因为我认为它是“编织”文档的关键包...如果我删除它,opts_chunk 是没找到。

感谢您的帮助!

【问题讨论】:

    标签: r r-markdown


    【解决方案1】:

    我相信cache = TRUE 试图缓存在一个块中创建的 R 对象。您的第一个块不仅仅是创建对象:attachrequire 调用每个都有副作用:修改搜索列表、加载包等。这些副作用不会被缓存,但它们是您所需要的文档工作:由于knitr 认为没有理由再次运行该块,因此您的文档在第二次运行时失败。

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

    你问为什么需要require(knitr)。严格来说,它不是必需的:您可以使用 knitr::opts_chunk 代替。但更重要的是,这个想法是 R Markdown 文档是对独立 R 会话的描述。是的,你需要knitr 来处理它,但它应该给出相同的结果,就好像你只是在一个空会话中单独运行代码一样。 (这并不完全正确:knitr 的块选项和钩子稍微修改了行为,但它是正在发生的事情的一个方便的心理模型。)

    【讨论】:

    • 感谢 user2554330!我知道cache 旨在存储对象并避免重复计算......这是有道理的。但是为什么这会使附件在第二次无法正常工作?
    • 如果你缓存了第一个块,它不会被第二次执行,所以不会发生任何必要的副作用。我已经编辑了答案来解释这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2016-11-24
    • 2020-03-06
    相关资源
    最近更新 更多