【问题标题】:Invalidate a chunk's cache when uncached chunk changes当未缓存的块更改时使块的缓存无效
【发布时间】:2013-08-22 09:07:13
【问题描述】:

我对 knitr 块选项“dependson”有疑问。据我了解手册,此选项应用于指定缓存块依赖于哪些其他缓存块。但是当 uncached 块发生变化时,有没有办法使块的缓存失效?

这是一个最小的例子:

文件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 块“缓存”的输出仍然是 42,因为依赖选项不适用。 在我的示例中,我也可以通过缓存第一个块来解决问题。但是,我不能这样做,因为在第一个块中我使用library() 并读取外部文件,因此不应缓存此块。

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

【问题讨论】:

    标签: r knitr


    【解决方案1】:

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

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

    cache.whatever不是官方的chunk选项名称,但是你可以在knitr中使用任意选项,它们会影响缓存失效。这种情况下,当var更新时,缓存也会更新。

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

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

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

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

    【讨论】:

    • 感谢亿辉的回答!您建议的内容在分别应用于每个块时有效,但似乎我无法将 cache.whatever=var 设置为全局块选项。使用opts_chunk$set(cache.whatever=var) 无效。这个问题也有解决方案吗?
    • 行得通,再次感谢您!也许您应该在yihui.name/knitr/demo/cache 中提及这一点?顺便说一句,在我看来,除非事先定义了 foo,否则设置 opts_chunk$set(cache.whatever = quote(foo)) 会引发错误。最后一个问题:cache.whatever=c(quote(foo), quote(bar))cache.whatever=list(quote(foo), quote(bar)) 似乎都不起作用。有没有其他方法可以为每个选项使用多个变量?
    • @user2706569 请随时help me 更新文档。对于您的最后一个问题,请参阅上面的编辑答案。
    • 我不确定我是否能足够准确地描述问题及其解决方案,但我会尽可能地为文档做出贡献。感谢您修改答案!
    猜你喜欢
    • 2011-05-26
    • 1970-01-01
    • 2014-07-09
    • 2022-11-10
    • 2018-03-14
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多