2013-02-26 4 views
4

J'ai un problème avec les fichiers enfants dans knitr. La mise en cache fonctionne correctement, mais les dépendances ne fonctionnent pas. Mon exemple de bac à sable ressemble à ça:Mise en cache des fichiers enfants dans 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} 

Avec le « child.Rnw » qui ressemble à ceci:

<<child>>= 
print(x) 
@ 

Quand je compile maintenant le code, puis changer x en morceau puis une la recompiler : le morceau b réagit correctement, mais pas l'enfant. Est-ce que je fais quelque chose qui ne va pas?

Merci pour l'aide!

Répondre

3

J'ai réfléchi un moment à ce problème et je trouve qu'il est difficile de le résoudre pour le moment. Le problème est que le document parent ne sait pas vraiment ce qui se trouve dans le document enfant et que dep_auto() ne prend pas en compte les documents enfants lors de la définition de la structure de dépendance. Il y a deux façons de résoudre ce problème. Le premier est hackish:

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

Comme vous le savez sans doute, ::: signifie « zone de danger » dans l'affaire R. Dans knitr, dep_list est l'objet interne qui contrôle la structure de dépendance. Les deux dep_auto() et dep_prev() s'appuient sur cet objet (de la même manière que fonctionne l'option de bloc dependson).

La deuxième méthode consiste à écrire votre objet dans des options de segment, par ex.

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

Lire la troisième section the knitr cache page pour plus de détails.

+0

Un grand merci pour les pensées! J'ai essayé la deuxième façon, ajouté tous les objets du document parent à tous les morceaux du document enfant et il semble fonctionner. – panuffel