在knitr中缓存子文件

时间:2013-02-26 16:44:14

标签: r caching latex children knitr

我在knitr中遇到了子文件的问题。缓存工作正常,但依赖项不起作用。我的沙箱示例如下:

\documentclass{article}

\begin{document}

<<setup, cache=FALSE>>=
opts_chunk$set(cache=TRUE, autodep=TRUE)
dep_auto() # figure out dependencies automatically
@

<<a>>=
x <- 14
@

<<b>>=
print(x)
@

<<child, child='child.Rnw', eval=TRUE>>=
@

\end{document}

'child.Rnw'看起来像这样:

<<child>>=
print(x)
@

当我现在编译代码时,然后在块a中更改x然后再次编译它:chunk b正确反应,但是孩子没有。我做了一件明显不对的事吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:4)

我想了一下这个问题,我发现现在很难解决。问题是父文档并不真正知道子文档中的内容,dep_auto()在设置依赖关系结构时不会考虑子文档。有两种方法可以解决这个问题。第一个是hackish:

knitr:::dep_list$set(a = c('child', 'b'))

您可能知道,:::表示R中的“危险区域”。在knitr中,dep_list是控制依赖关系结构的内部对象。 dep_auto()dep_prev()都依赖于此对象(类似于块选项dependson的工作方式)。

第二种方法是将对象写入块选项,例如

<<child, whatever=x>>=
print(x)
@

阅读the knitr cache page中的第三部分了解详情。