特定のチャンク内の環境を再現するために、knitr のキャッシュされた結果をどのように使用できますか? 質問する

特定のチャンク内の環境を再現するために、knitr のキャッシュされた結果をどのように使用できますか? 質問する

要約

私の質問:Rセッション内で、ニットのキャッシュされた結果を使用して、それ自体が行うのと同じ意味で、特定のコード ブロックで使用可能な環境 (つまり、オブジェクトのセット) に「早送り」できますかknit()?


設定:

ニットの組み込みのコード チャンクのキャッシュは、その優れた機能の 1 つです。

これは、一部のチャンクに時間のかかる計算が含まれている場合に特に役立ちます。チャンク (またはチャンクが依存するチャンク) が変更されない限り、計算はドキュメントが最初にknited されたときにのみ実行する必要があります。それ以降の の呼び出しでは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セッション内で、ニットのキャッシュされた結果を使用して、それ自体が行うのと同じ意味で、特定のコード ブロックで使用可能な環境 (つまり、オブジェクトのセット) に「早送り」できますかknit()?


purl("lotsOfComps.Rnw")コードを実行してから実行しても、"lotsOfComps.R"途中のすべてのオブジェクトを再計算する必要があるため、機能しません。

理想的には、次のようにして、 の開始時に存在する環境に到達することが可能です<<interestingChunk>>=

spin("lotsOfComps.Rnw", chunk="interestingChunk")
ls()
# [1] "x"
x
# [1] 3 8

はまだ利用できないためspin()、同等の結果を得るための最善の方法は何ですか?

ベストアンサー1

ここで 1 つの解決策を紹介します。まだ少し扱いに​​くいですが、機能します。アイデアは、 という名前のチャンク オプションを追加することです。muteこれはNULLデフォルトで を受け取りますが、以下のように R 式も受け取ることができます。がチャンク オプションを評価するmute_later()と、が評価され、が返されます。同時に、 には副作用があります( のようなグローバル チャンク オプションを設定します)。knitrmute_later()NULLopts_chunkeval = FALSE

ここで必要なのは、mute=mute_later()残りのチャンクをスキップするチャンクを に入れることです。たとえば、このオプションを から に移動できますexample-a。はオプションのデフォルト値である を返すexample-bため、このオプションを移動してもキャッシュは壊れません。mute_later()NULLmute

\documentclass{article}
\begin{document}

<<setup, include=FALSE, cache=FALSE>>=
rm(list = ls(all.names = TRUE), envir = globalenv())
opts_chunk$set(cache = TRUE) # enable cache to make it faster
opts_chunk$set(eval = TRUE, echo = TRUE, include = TRUE)

# set global options to mute later chunks
mute_later = function() {
  opts_chunk$set(cache = FALSE, eval = FALSE, echo = FALSE, include = FALSE)
  NULL
}
# a global option mute=NULL so that using mute_later() will not break cache
opts_chunk$set(mute = NULL)
@

<<example-a, mute=mute_later()>>=
x = rnorm(4)
Sys.sleep(5)
@

<<example-b>>=
y = rpois(10,5)
Sys.sleep(5)
@

<<example-c>>=
z = 1:10
Sys.sleep(3)
@

\end{document}

切り取って貼り付ける必要があるという意味で、扱いにくいです, mute=mute_later()。理想的には、私が Barry のために書いた gist のように、チャンク ラベルを設定する必要があります。

私のオリジナルの gist が機能しなかった理由は、チャンクがキャッシュされるときにチャンク フックが無視されるからです。2 回目にknit()ファイルを実行すると、チャンク フックcheckpointexample-aスキップされ、eval=TRUE残りのチャンクについては、すべてのチャンクが評価されたことがわかります。比較すると、チャンク オプションは常に動的に評価されます。

おすすめ記事