Кэширование внешнего кода 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"}
``` 
Другие вопросы по тегам