从多个Rmd文件缓存knitr外部代码

时间:2014-06-02 21:38:54

标签: r caching knitr

我很难让knitr在外部R文件中共享公共源代码的两个Rmd文档之间使用缓存。虽然我可以在文件系统中看到两个文档都将输出写入同一组缓存文件,但每次将一个Rmd文档编织为HTML时,它会覆盖上一个Rmd编织时创建的缓存文件。同一Rmd文件的多个编织成功利用缓存而不重新执行共享代码。我是否遗漏了配置缓存选项以支持多个文档的内容?

示例代码和sessionInfo()转储如下。提前感谢您提供的任何帮助。

test1.R

## @knitr source_chunk_1
x <- Sys.time()
x

test1a.Rmd

```{r set_global_options, cache=FALSE}
library(knitr)
opts_knit$set(self.contained = FALSE)
opts_chunk$set(cache = TRUE, cache.path = "knitrcache/test-")
read_chunk("test1.R")
```

```{r local_chunk_1, ref.label="source_chunk_1"}
```

test1b.Rmd

```{r set_global_options, cache=FALSE}
library(knitr)
opts_knit$set(self.contained = FALSE)
opts_chunk$set(cache = TRUE, cache.path = "knitrcache/test-")
read_chunk("test1.R")
```

```{r local_chunk_1, ref.label="source_chunk_1"}
```

sessionInfo

> sessionInfo()
R version 3.1.0 (2014-04-10)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252           
LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                           LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     
other attached packages:
[1] knitr_1.5
loaded via a namespace (and not attached):
[1] evaluate_0.5.3   formatR_0.10     rmarkdown_0.2.05 stringr_0.6.2    tools_3.1.0     

1 个答案:

答案 0 :(得分:1)

在github的knitr源代码下载和黑客攻击后,我相信我找到了问题的根源。 block.R中的代码通过调用digest()函数来设置缓存的哈希值,其中包含正在处理的代码块的内容和选项:

hash = paste(valid_path(params$cache.path, label), digest::digest(content), sep = '_')

我暂时插入代码,为上面的每个示例Rmd脚本写出存储在内容对象中的数据。默认的fig.path选项值是内容中唯一不同的组件。

 > content$fig.path
[1] "./test1a_files/figure-html/"  

> content$fig.path
[1] "./test1b_files/figure-html/"

在每个Rmd文件中设置全局fig.path会导致内容对象和生成的哈希值相同。现在,当我编写两个Rmd文件时,两者都使用相同的缓存值。

<强> Test1.R

## @knitr source_chunk_1
x <- Sys.time()
x

<强> test1a.Rmd

```{r set_global_options, cache=FALSE}
library(knitr)
opts_knit$set(self.contained = FALSE)
opts_chunk$set(cache = TRUE, cache.path = "knitrcache/test-", fig.path = "knitrfig/test-")
read_chunk("test1.R")
```

```{r local_chunk_1, ref.label="source_chunk_1"}
``` 

<强> test1b.Rmd

```{r set_global_options, cache=FALSE}
library(knitr)
opts_knit$set(self.contained = FALSE)
opts_chunk$set(cache = TRUE, cache.path = "knitrcache/test-", fig.path = "knitrfig/test-")
read_chunk("test1.R")
```

```{r local_chunk_1, ref.label="source_chunk_1"}
```