tl;dr
Мой вопрос: есть ли в сеансе R какой-либо способ использовать кэшированные результаты knitr для "быстрой перемотки вперед" к доступной среде (т. е. к набору объектов) в данном блоке кода, в том же смысле, что и сам knit()
?
Настраивать:
Встроенное кэширование фрагментов кода knitr — одна из его замечательных функций.
Это особенно полезно, когда некоторые фрагменты содержат трудоемкие вычисления. Если они (или чанк, от которого они зависят) не изменены, вычисления нужно выполнять только при первом knit
редактировании документа: при всех последующих вызовах knit
объекты, созданные чанком, будут просто загружены из кеша.
Вот минимальный пример, файл с именем "lotsOfComps.Rnw"
:
\documentclass{article}
\begin{document}
The calculations in this chunk take a looooong time.
<<slowChunk, cache=TRUE>>=
Sys.sleep(30) ## Stands in for some time-consuming computation
x <- sample(1:10, size=2)
@
I wish I could `fast-forward' to this chunk, to view the cached value of
\texttt{x}
<<interestingChunk>>=
y <- prod(x)^2
y
@
\end{document}
Время, необходимое для вязания и TeXify "lotsOfComps.Rnw"
:
## First time
system.time(knit2pdf("lotsOfComps.Rnw"))
## user system elapsed
## 0.07 0.02 31.81
## Second (and subsequent) runs
system.time(knit2pdf("lotsOfComps.Rnw"))
## user system elapsed
## 0.03 0.02 1.28
Мой вопрос:
Есть ли в сеансе R какой-либо способ использовать кэшированные результаты knitr для «быстрой перемотки вперед» в среду (т. е. набор объектов), доступных в данном блоке кода, в том же смысле что knit()
сам делает?
Выполнение purl("lotsOfComps.Rnw")
, а затем запуск кода в "lotsOfComps.R"
не работает, потому что все объекты на этом пути должны быть пересчитаны.
В идеале можно было бы сделать что-то подобное, чтобы оказаться в среде, которая существует в начале <<interestingChunk>>=
:
spin("lotsOfComps.Rnw", chunk="interestingChunk")
ls()
# [1] "x"
x
# [1] 3 8
Поскольку spin()
(пока?) недоступен, как лучше всего получить эквивалентный результат?
checkpoint
была сброшена / сохранена в глобальной среде, чтобы она была доступна после запускаknit()
.trace(knit, quote(on.exit({assign("ChunkEnv", envir, envir = .GlobalEnv)})))
- самое близкое, что я получил, но, похоже, оно сохраняет среду последнего фрагмента независимо от того, какой из них я установил в качестве контрольной точки. Похоже, мне придется намного глубже вникнуть в код Knitr, прежде чем я смогу расколоть этот орех. - person Josh O'Brien   schedule 31.03.2013.GlobalEnv
? - person Yihui Xie   schedule 31.03.2013knit
работаю с вашим"knitr-checkpoint.Rnw"
. Первый раз делаюknit("knitr-checkpoint.Rnw"); ls()
, толькоx
есть в.GlobalEnv
. Все хорошо. Во второй и последующие разы я делаюknit("knitr-checkpoint.Rnw")
, однако он игнорирует контрольную точку и запускает все куски.ls()
затем показываетx
иy
в.GlobalEnv
. Пока что мой единственный обходной путь — сбросить наcheckpoint = 'example-a'
,knit()
, а затем сбросить наcheckpoint = 'example-b'
иknit()
. Потом опять хорошо, но только на один прогон без смены контрольной точки. Сбивает с толку! - person Josh O'Brien   schedule 31.03.2013