Кэширование дочерних файлов в 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 в чане a, а потом снова компилирую: чанк b реагирует нормально, а дочерний — нет. Я делаю что-то явно не так?

Спасибо за помощь!


person panuffel    schedule 26.02.2013    source источник
comment
В этом отношении может оказаться полезным новый пакет R cache.   -  person MYaseen208    schedule 23.06.2021


Ответы (1)


Я некоторое время думал об этой проблеме, и мне трудно решить ее в данный момент. Проблема в том, что родительский документ на самом деле не знает, что находится в дочернем документе, а dep_auto() не учитывает дочерние документы при настройке структуры зависимостей. Есть два способа решить эту проблему. Первый хакерский:

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

Как вы, наверное, знаете, ::: в R означает «опасная зона». В knitr dep_list — это внутренний объект, управляющий структурой зависимостей. И dep_auto(), и dep_prev() полагаются на этот объект (аналогично тому, как работает опция чанка dependson).

Второй способ - записать свой объект в параметры фрагмента, например.

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

Подробнее читайте в третьем разделе на странице кэша Knitr.

person Yihui Xie    schedule 26.02.2013
comment
Большое спасибо за мысли! Попробовал второй способ, добавил все объекты из родительского документа во все куски дочернего документа и вроде получилось. - person panuffel; 27.02.2013