如何针对一个 knitr markdown 文档设置 cache=FALSE 并覆盖代码块设置?

24
我知道在使用R Markdown和knitr时可以使用cache=TRUE选项来缓存R代码块。例如,它可能看起来像这样:

...

```{r longanalysis, cache=TRUE}
for (i in 1:5000) {
    lm((i+1)~i)
}
```

我意识到如果我想要禁用该分析的缓存,可以在代码块中将选项更改为cache=FALSE。然而,如果有许多启用缓存的 R 代码块,这将需要仔细的查找和替换操作。

问题

  • 是否有一种方法可以临时为整个 R Markdown 文档设置cache=FALSE

评论

我看过这个示例,其中第一行是设置全局设置的方式,但我认为本地设置会覆盖全局设置。

`r opts_chunk$set(fig.width=5, fig.height=5, fig.path='')`
3个回答

35

看起来默认设置为FALSE,本地块选项会覆盖全局选项,但你可以在文档顶部添加以下内容将全局选项设置为默认缓存。

`r opts_chunk$set(cache=TRUE)`

如果您不希望某些部分被缓存,您可以将这些部分的cache属性显式设置为FALSE。

如果您希望禁止整个文档缓存,则可以将全局选项更改为FALSE并重新运行该选项。

问题在于,如果任何代码块选项被设置为cache=TRUE,则这些选项将覆盖全局设置,并且如果您将全局选项设置为FALSE,则不会重新运行它们。因此,我认为实现您想要的唯一方法是将默认值更改为cache=TRUE,将不希望缓存的代码块显式设置为cache=FALSE,然后在需要时切换全局选项为FALSE以达到您想要的目标。


3
谢谢您的帮助。不过,我想我已经解决了自己的问题。我一直困扰于它必须是一个设置的想法,但实际上只需要删除缓存文件夹中的内容就行了。 - Jeromy Anglim
1
@JeromyAnglim 那也可以。不过我仍然更喜欢默认情况下缓存所有内容,而且额外的好处是你遇到的问题可以在不必导航到文件夹并删除缓存文件夹的情况下解决。 - Dason
谢谢。我会尝试两种方法。我对缓存不太熟悉。我想这里有一个权衡。你改变代码块的频率有多高,已经运行的代码块会受到影响。代码有多慢。你需要多经常编织成HTML等等。 - Jeromy Anglim
即使一个块被缓存了,如果你对它进行更改,那么它应该重新运行。我通常不缓存加载包这一步骤,因为如果缓存这些调用,会导致问题出现。 - Dason
1
我认为Dason的解决方案是通常应该采取的方法。问题归结为全局与本地块选项,而opts_chunk$set()就是答案。删除缓存目录听起来有些暴力,但它也能起作用 :) - Yihui Xie

20

删除缓存选项

knitr 创建一个目录来存储缓存对象,默认情况下称为 cache。 要确保所有分析都运行而不管代码块 cache 设置,只需删除缓存目录的内容

因此,在 Linux 上的 Rstudio 中

  1. 转到菜单 工具 - Shell 以在包含 markdown 文件的工作目录中打开控制台。
  2. 输入命令 rm cache/*

基本工作流程

这是我目前的基本工作流程

  • 如果编织速度很快(例如不到10秒),则不缓存。
  • 如果编织需要一段时间(例如超过10秒),请将 `r opts_chunk$set(cache=TRUE)` 添加到 R Markdown 文件中。
  • 如果缓存引起问题且编织相对较快(例如几分钟内),则删除整个缓存。
  • 如果缓存引起问题且编织需要很长时间(例如几分钟或几小时),请命名 R 代码块并在 knitr 中使用 dependson 选项。命名还允许选择性地在缓存目录中删除命名的 R 代码块。

1
“工具” > “Shell” 似乎会在 r 交互式控制台的当前工作目录中打开一个控制台。这可能与包含 markdown 文件的目录位置不同,后者是缓存存储的位置。 - Sparhawk

17

当你已经创建了文档,就太晚了,但对于未来的文档,您可能需要考虑使用参数由knitr评估这一事实。这意味着您可以拥有以下内容:

```{r data.loading.chunk1, cache = cachedata}
blah blah
```
blah blah

```{r model.fitting.chunk1, cache = cachemodels}
blah blah
```

然后在文档顶部我有这样的内容:

```{r libraries.etc, echo=FALSE, results='hide', message=FALSE}
cachedata = TRUE
cachemodels = TRUE
```

这样可以让您快速为大量块打开或关闭缓存。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接