带参数渲染时如何缓存中间结果?

mda*_*g02 5 r knitr r-markdown

使用 RMarkdown,我尝试为参数的不同值呈现参数化报告。Rmd 文件使用缓存。

如果我在 RStudio 中编织,缓存将按预期工作,并且首先构建编织按钮:缓存,然后在每次连续编织时使用,即使我更改 YAML 标头中的参数值也是如此。

但是,当使用我的参数值循环并使用rmarkdown::render()缓存时,每次迭代都会重建缓存。

文件test.Rmd

---
title: "Untitled"
author: "Author"
params:
  id: 0
date: "23/10/2019"
output: html_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```

## Test `r params$id`

```{r cars, cache=TRUE}
## open and work on large file (simulate)
test <- mtcars
Sys.sleep(10)
```
Run Code Online (Sandbox Code Playgroud)

和渲染脚本:render.R

---
title: "Untitled"
author: "Author"
params:
  id: 0
date: "23/10/2019"
output: html_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```

## Test `r params$id`

```{r cars, cache=TRUE}
## open and work on large file (simulate)
test <- mtcars
Sys.sleep(10)
```
Run Code Online (Sandbox Code Playgroud)

该脚本需要 5 * 10 秒才能运行,而不是大约 10 秒。

我做错了什么?如何使用缓存?

Yih*_*Xie 5

它与参数无关,可以通过下面的最小化表示(test.Rmd)通过取出参数(以及不相关的tidyverse)来显示:

---
title: "Untitled"
---

```{r, cache=TRUE}
Sys.sleep(10)
```
Run Code Online (Sandbox Code Playgroud)

然后运行

---
title: "Untitled"
---

```{r, cache=TRUE}
Sys.sleep(10)
```
Run Code Online (Sandbox Code Playgroud)

问题来自output_file,它在每次迭代中都会发生变化。对于 R Markdown 文档,输出文件名决定knit chunk 选项fig.path。例如,当output_file = "file1.html",fig.path设置为时file1_files/html/

当代码块的任何块选项发生更改时,knitr将使其缓存失效。在您的情况下,fig.path每次都使缓存无效。为了避免这种情况,你必须稳定这个选项,例如,

---
title: "Untitled"
---

```{r, cache=TRUE, fig.path='test_files/html/'}
Sys.sleep(2)
```
Run Code Online (Sandbox Code Playgroud)