почему кеш перестраивается когда не должно быть? - PullRequest
1 голос
/ 27 апреля 2019

Минимальный пример выглядит следующим образом:

\documentclass{article}

<<setup, echo = FALSE>>=
knitr::opts_chunk$set(
  cache = TRUE,
  autodep = TRUE
)
@

\begin{document}
<<chunk1>>=
n <- 6
rnorm(n)
@

<<chunk2>>=
n <- 10
rnorm(n)
@

\end{document}

Запустите код один раз, результаты кешируются. Когда я изменяю код в первом чанке, скажем n <- 10 и перезапускаю код, чанк2 также перестраивается. Я ожидаю, что chunk2 не будет перестроен, так как он не должен зависеть от n в первом чанке.


Я использовал rnorm в приведенном выше примере. Как упомянуто @ m0nhawk, два куска косвенно связаны. Следующий код не включает случайные. Проблема все та же.

\documentclass{article}

<<setup, echo = FALSE>>=
knitr::opts_chunk$set(
  cache = TRUE,
  autodep = TRUE
)
@

\begin{document}
<<chunk1>>=
n <- 6
print(seq_len(n))
print(Sys.time())
@

<<chunk2>>=
n <- 10
print(seq_len(n))
print(Sys.time())
@


\end{document}

Ответы [ 2 ]

0 голосов
/ 16 мая 2019

Я считаю, что это ошибка knitr , и я только что установил исправление на Github. Это произошло из-за попытки исправить еще одну связанную проблему . Подумав еще раз, я решил, что проблема, о которой вы сообщили, должна иметь более высокий приоритет, поэтому ваш пример должен хорошо работать после очистки каталога cache/ и установки версии dev knitr :

remotes::install_github('yihui/knitr')
0 голосов
/ 27 апреля 2019

Эти два блока косвенно связаны с .Random.seed.

knitr имеет поддержку для сохранения случайное начальное число , но оно не будет работать напрямую.

Чтобы заставить это работать, добавьте rand_seed к opts_chunk и установите различные семена для каждого куска:

\documentclass{article}

<<setup, echo = FALSE>>=
knitr::opts_chunk$set(
  cache = TRUE,
  autodep = TRUE,
  cache.extra = rand_seed
)
@

\begin{document}
\SweaveOpts{concordance=TRUE}
<<chunk1>>=
set.seed(100)
n <- 10
rnorm(n)
@

<<chunk2>>=
set.seed(101)
n <- 10
rnorm(n)
@
\end{document}
...