2012-03-02 6 views
13

私は報告書を書き直そうとしています。問題は、私がレポートで使用するパッケージ(ggplot2、MASS、キューブなど)をRでコンパイルするときです。これは非常に時間がかかります。パッケージを詰め込む方法はありますか?Sweave Cacheパッケージ

見つかったcacheSweaveしかし、動作しません。

<<cacheSweave, eval=TRUE, echo=FALSE, term=FALSE, cache=TRUE>>= 
library(cacheSweave) 
lapply(c("ghyp","MASS","nloptr","cubature","ggplot2"), require, character.only=T) 
@ 

おかげ

+1

ロードパッケージはキャッシュされない「副作用」と呼ばれるものです。あなたが 'knitr'を使うなら、私はあなたに行く方向を指すことができます –

+0

私は知りませんでした* knitr *、それはinteresstingに見えます。私は今週末にそれを試してみるでしょう!あなたはニットでどうやってやりますか?ありがとう – rainer

答えて

18

あなたはknitrパッケージに興味を示したので、私はこの機能を実装するいくつかの時間を費やし、そしてあなたが開発をダウンロードすることができますバージョンはhttps://github.com/yihui/knitrです。私が言ったように、cacheSweaveは副作用を保存しません。 CRAN上のknitrの現在の安定バージョンは、印刷の副作用のみを保存し、パッケージをロードすることによる副作用はGitHubの開発バージョン(> = 0.3.3)で保持されます。キャッシュされたチャンクを実行すると、すべてのパッケージ名がファイル__packagesにキャッシュされます。次回このチャンクを再構築するとき、すべてのパッケージがロードされてチャンク内のコードが実行されます。そうでない場合、このチャンクはスキップされます。つまり、パッケージは本当に必要なときにのみロードされます。

これを行うもう1つの方法は、開発バージョンをインストールする必要がないチャンクフックを使用することです。そして、あなたはオプションpackagesがの文字ベクトルである

<<test, packages=c('MASS', 'ggplot2')>>= 
qplot(rnorm(100)) 
@ 

のように、このチャンクのオプションを使用することができます

<<setup, include=FALSE, cache=FALSE>>= 
knit_hooks$set(packages = function(before, options, envir) { 
    if (before) { 
    ## load packages before a chunk is executed 
    for (p in options$packages) library(p, character.only = TRUE) 
    } 
}) 
@ 

:たとえば、あなたはpackagesという名前チャンクオプションを追加、などチャンクフックを設計することができますパッケージ名は、上記で定義したチャンクフックによって使用されます。この方法の欠点は、多くのチャンクに対してこのpackagesベクタを指定しなければならないことです。一方、最初のアプローチは自動です。チャンクフックがどのように機能するかを学ぶのに数分を費やす必要があるかもしれません。knitrhttp://yihui.name/knitr/hooks

1

あなたは、あなたのはSweave(RNW)ファイルにlibrary(cacheSweave)を呼び出すことはありません:

これは私がのSweaveファイルに追加塊です。次test.rnwファイルを考えてみましょう:

\documentclass{article} 
<<cachedCode,cache=TRUE>>= 
#this Sweave block will be cached 
@ 
\begin{document} 
\end{document} 

を次に、あなたが使用してこれを実行します:

require(cacheSweave) 
Sweave('test.rnw', driver=cacheSweaveDriver) 
+1

あなたの声明は本当ですが、OPの質問に答えていません(上記の@ Yihuiのコメントを参照) –