R - 为什么在不应该重建缓存时重建缓存



一个最小的例子如下:

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}
这两个

块通过.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}
我认为

这是knitr的错误,我刚刚在Github上推送了一个修复程序。发生这种情况是因为试图解决另一个相关问题。经过再三考虑,我决定您报告的问题应该具有更高的优先级,因此在清除cache/目录并安装 knitr 的开发版本后,您的示例应该可以正常工作:

remotes::install_github('yihui/knitr')

相关内容

  • 没有找到相关文章