当未缓存的块更改时,使块的缓存无效

时间:2013-08-22 09:07:13

标签: r knitr

我有一个关于knitr chunk选项“依赖”的问题。据我所知,手册此选项应该用于指定缓存块所依赖的其他缓存块。但有没有办法在未缓存的块更改时使块的缓存无效?

这是一个最小的例子:

文件 knitrtest.Rnw

\documentclass{article}
\begin{document}

<<>>=
library(knitr)

read_chunk("chunks.R")
@

<<not_cached>>=
@

<<cached, cache=TRUE, dependson="not_cached">>=
@

\end{document}

文件 chunks.R

## @knitr not_cached
var <- 42

## @knitr cached
var

当我更改 var 时,chunk“cached”的输出仍为42,因为dependson选项不适用。 在我的例子中,我也可以通过缓存第一个块来解决问题。但是,我不能这样做,因为在第一个块中我使用library()并读入外部文件,因此不应缓存此块。

当未缓存的块发生更改时,是否有办法使缓存无效?

1 个答案:

答案 0 :(得分:6)

是的,您可以将var作为块选项的一部分,例如

<<cached, cache=TRUE, cache.whatever=var>>=
@

cache.whatever不是正式的块选项名称,但您可以在knitr中使用任意选项,它们将影响缓存失效。在这种情况下,更新var时,将更新缓存。

如果希望var影响所有缓存的块,可以将其设置为全局选项,但请记住将其设置为未评估的表达式:

opts_chunk$set(cache.whatever = quote(var))

您可以在quote()中使用任意R表达式,因此如果您有更多变量,可以将它们放在列表中,例如

opts_chunk$set(cache.whatever = quote(list(var1, var2)))