2013-02-26 68 views
4

我在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) 
@ 

現在當我編譯代碼,然後在塊的改變X,然後再編譯:塊b正確反應,但孩子不反應。我做了什麼明顯錯誤?

感謝您的幫助!

回答

3

我想了一會兒才知道這個問題,現在我覺得很難修復。問題是父文檔並不真正知道子文檔中的內容,並且在設置依賴關係結構時不考慮子文檔。有兩種方法可以解決這個問題。第一個是hackish的:

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

正如你可能知道R.,:::手段「危險區」在knitrdep_list是控制依存結構內部的對象。 dep_auto()dep_prev()均依賴於此對象(類似於塊選項dependson的工作原理)。

第二種方法是將對象寫入塊選項,例如,

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

詳情請參閱the knitr cache page的第三部分。

+0

非常感謝您的想法!我嘗試了第二種方法,將父文檔中的所有對象添加到子文檔的所有塊中,並且似乎解決了問題。 – panuffel 2013-02-27 09:32:41