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

CL.*_*CL. 6 r knitr

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

这是一个最小的例子:

文件knitrtest.Rnw:

\documentclass{article}
\begin{document}

<<>>=
library(knitr)

read_chunk("chunks.R")
@

<<not_cached>>=
@

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

\end{document}
Run Code Online (Sandbox Code Playgroud)

文件块.R:

## @knitr not_cached
var <- 42

## @knitr cached
var
Run Code Online (Sandbox Code Playgroud)

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

有没有办法在未缓存的块更改时使缓存无效?

Yih*_*Xie 7

是的,您可以var参与块选项,例如

<<cached, cache=TRUE, cache.whatever=var>>=
@
Run Code Online (Sandbox Code Playgroud)

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

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

opts_chunk$set(cache.whatever = quote(var))
Run Code Online (Sandbox Code Playgroud)

你可以在里面使用任意的R表达式quote(),所以如果你有更多的变量,你可以将它们放在一个列表中,例如

opts_chunk$set(cache.whatever = quote(list(var1, var2)))
Run Code Online (Sandbox Code Playgroud)