Кэширование внешнего кода knitr из нескольких файлов Rmd
Мне трудно заставить knitr использовать кеширование между двумя документами Rmd, имеющими общий исходный код во внешнем R-файле. Хотя в файловой системе я вижу, что оба документа записывают выходные данные в один и тот же набор файлов кэша, каждый раз, когда один документ 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 ответ
После загрузки и взлома источника knitr из github, я считаю, что нашел источник проблемы. Код в 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/"
Установка глобального fig.path в каждом файле Rmd приводила к тому, что объекты содержимого и результирующие хеш-значения были идентичны. Теперь, когда я связываю два 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"}
```