为什么缓存在不应该重建的时候重建?

问题描述 投票:1回答:2

最小的例子如下:

\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并重新运行代码,chunk2也会重建。我希望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}
r knitr
2个回答
0
投票

这两个块是由.Random.seed间接相关的。

knitr支持拯救random seed,但它不会直接起作用。

为了使它工作,将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}

0
投票

我认为这是a bug of knitr,我只是在Github推a fix。这是因为试图修复another related issue。第二个想法,我认为您报告的问题应该具有更高的优先级,因此在清除cache/目录并安装knitr的开发版本后,您的示例应该可以正常工作:

remotes::install_github('yihui/knitr')
© www.soinside.com 2019 - 2024. All rights reserved.