2012-03-02 5 views
13

나는 보고서를 고르려고 노력하고있다. 문제는 보고서에 사용하는 패키지 (예 : ggplot2, MASS, 큐 ..)를 R이 컴파일 할 때마다 컴파일된다는 것이다. 이것은 매우 시간 소모적입니다. 패키지를 chache하는 방법이 있습니까?Sweave Cache packages

찾았습니다. 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 파일에 캐시됩니다. 다음 번에이 청크가 재 빌드 될 때 모든 패키지가 청크에서 코드를 실행하기 전에로드됩니다. 그렇지 않으면이 청크는 건너 뜁니다. 즉, 패키지는 실제로 필요할 때만로드됩니다.

다른 방법으로는 청크 후크를 사용하는 것이지만, 개발 버전을 설치할 필요가 없습니다. 그런 다음 옵션 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라는 이름의 청크 옵션을 추가하고, 같은 덩어리 후크를 디자인 할 수 있습니다 패키지 이름은 위에 정의 된 chunk hook에 의해 사용됩니다. 이 방법의 단점은 많은 청크에 대해이 packages 벡터를 지정해야하는 반면 첫 번째 방법은 자동이라는 점입니다. 덩어리 걸이가 어떻게 동작하는지 배우는 데 몇 분이 걸릴 수도 있습니다. knitr : http://yihui.name/knitr/hooks

1

당신은 당신의 Sweave (RNW) 파일 library(cacheSweave)를 호출하지 않습니다

이 내가 sweave 파일에 추가 청크입니다.

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

그런 다음 사용이 실행됩니다 : 다음 test.rnw 파일 고려

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

귀하의 진술은 사실이지만 OP 질문에 대답하지 않습니다 (위의 @ Yihui의 코멘트 참조) –