2013-08-22 1 views
2

knitr 청크 옵션 "dependson"에 관한 질문이 있습니다. 내가이 매뉴얼을 이해한다면,이 옵션은 캐시 된 덩어리가 의존하는 다른 캐시 된 덩어리를 지정하는데 사용되어야한다. 그러나 캐시되지 않은 청크가 변경되면 청크의 캐시를 무효화 할 수 있습니까? knitrtest.Rnw캐시되지 않은 청크가 변경 될 때 청크의 캐시를 무효화하십시오.

파일 : 여기

는 최소한의 예입니다

\documentclass{article} 
\begin{document} 

<<>>= 
library(knitr) 

read_chunk("chunks.R") 
@ 

<<not_cached>>= 
@ 

<<cached, cache=TRUE, dependson="not_cached">>= 
@ 

\end{document} 

파일 chunks.R :

## @knitr not_cached 
var <- 42 

## @knitr cached 
var 

내가 변경 VAR 출력에서 dependons 옵션처럼 "캐시 된"청크는 여전히 42입니다. 적용되지 않습니다. 예를 들어 첫 번째 청크를 캐싱하여 문제를 해결할 수도 있습니다. 그러나 첫 번째 청크에서는 library()을 사용하고 외부 파일을 읽으므로이 작업을 수행 할 수 없습니다. 따라서이 청크를 캐시해서는 안됩니다.

캐시되지 않은 청크가 변경되면 캐시를 무효화 할 수 있습니까?

답변

2

예, var을 청크 옵션의 일부로 사용할 수 있습니다.

<<cached, cache=TRUE, cache.whatever=var>>= 
@ 

cache.whatever 공식 청크 옵션 이름이 아닙니다,하지만 당신은 knitr에 임의의 옵션을 사용할 수 있습니다, 그들은 캐시 무효화에 영향을 미칠 것입니다. 이 경우 var이 업데이트되면 캐시가 업데이트됩니다. 그래서, 당신은 quote() 내부에 임의의 R 식을 사용할 수 있습니다

opts_chunk$set(cache.whatever = quote(var)) 

: 모든 캐시 덩어리에 영향을 var을 원하는 경우에

, 당신은 글로벌 옵션으로 설정하지만, 평가되지 않은 표현으로 설정 기억 변수가 더 많은 경우 목록에 넣을 수 있습니다 (예 :

opts_chunk$set(cache.whatever = quote(list(var1, var2))) 
+0

감사합니다. Yihui! 각각의 청크에 개별적으로 적용 할 때 당신이 제안한 것은 효과가 있지만,'chunk.whatever = var'를 전역 청크 옵션으로 설정할 수없는 것처럼 보입니다. 'opts_chunk $ set (cache.whatever = var)를 사용하면 효과가 없습니다. 이 문제에 대한 해결책이 있습니까? –

+0

@ user2706569 나는 위의 대답을 편집했다. –

+0

그것이 작동합니다. 다시 한번 감사드립니다! 아마 http://yihui.name/knitr/demo/cache/에서 이것을 언급해야할까요? 그런데,'opts_chunk $ set (cache.whatever = quote (foo))'를 설정하는 것이'foo'가 미리 정의되어 있지 않으면 에러를 발생시키는 것처럼 보입니다. 마지막 질문 : cache.whatever = c (quote (foo), quote (bar))도 cache.whatever = list (quote (foo), quote (bar))도 작동하지 않는 것 같습니다. 옵션 당 둘 이상의 변수를 사용하는 다른 방법이 있습니까? –

관련 문제