在knitr中缓存子文件

pan*_*fel 6 latex caching children r 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}
Run Code Online (Sandbox Code Playgroud)

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

<<child>>=
print(x)
@
Run Code Online (Sandbox Code Playgroud)

当我现在编译代码,然后在块a中更改x然后再次编译它:chunk b正确反应,但是孩子没有.我做错了什么吗?

谢谢您的帮助!

Yih*_*Xie 4

这个问题我想了一会儿,目前觉得很难解决。问题在于父文档并不真正知道子文档中的内容,并且dep_auto()在设置依赖关系结构时没有考虑子文档。有两种方法可以解决这个问题。第一个是黑客的:

knitr:::dep_list$set(a = c('child', 'b'))
Run Code Online (Sandbox Code Playgroud)

您可能知道,:::在 R 中表示“危险区域”。 In 中knitr,dep_list是控制依赖结构的内部对象。和dep_auto()都dep_prev()依赖于这个对象(类似地,这就是 chunk 选项的方式dependson工作原理)。

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

<<child, whatever=x>>=
print(x)
@
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请阅读knitr 缓存页面中的第三部分。