2013-09-07 7 views
6

이것은 대단히 간단한 요청이며, 아직 해결책을 찾지 못했다고는 생각하지 않지만 운이 없다면 지금까지 광범위하게 검색해 왔습니다.ESS & Knitr/Sweave : Rnw 파일을 대화식 세션으로 보내는 방법은 무엇입니까?

나는 .Rnw 파일을 Emacs에로드했고, 나는 M-n s을 사용하여 컴파일했다. 모든 것이 잘 작동하고 버퍼도 R 개까지 열립니다. 큰. 하지만 버퍼 은 전적으로 쓸모가 없습니다. 그것은 내가 방금 제공 한 객체를 포함하지 않습니다!

예 최소한의 .Rnw 파일 :

\documentclass{article} 
\begin{document} 
<<>>= 
    foo <- "bar" 
@ 
\end{document} 

M-n s을 사용하여, 나는 지금로드 세션으로 새로운 R-버퍼를 가지고 있지만 :

> foo 
Error: object 'foo' not found 

실망 그. 나는 데이터를 대화식으로 놀고 싶다. 어떻게 달성 할 수 있습니까? 나는 파일을 줄 단위로 소싱하고 싶지 않다. 지역별로 C-c C-c 또는 코드를 변경할 때마다 비슷한 내용을 원한다. 이상적으로는 Rstudio의 소스 함수와 같아야합니다. 즉, 을 완전히 준비된 R 세션으로 남겨 둡니다.

아직 스웨터로 시도하지 않았으며 knitr 만 사용했습니다.

EDIT : eval=TRUE 청크 옵션이 올바른 동작을하지 않는 것 같습니다.

답변

6

이 동작은 최근에 ESS에서 변경되었습니다. 이제 sweave 및 knitr은 명령 줄에서 직접 작성하는 것처럼 전역 환경에서 직접 실행됩니다. ESSv13.09가 종료 될 때까지 2 주 이상 기다리거나 개발 버전을 사용하십시오.

또는 ess-swv-processing-command을 "% s (% s)"으로 설정할 수도 있으며 자동 라이브러리로드를 제외하고 동일한 결과를 얻습니다.

기록을 위해 knitr (스웨터와 달리)은 사용자가 별도로 지시하지 않는 한 자체 환경의 모든 것을 평가합니다.

[편집 : 문제가 생겼습니다. 더 이상 정확한 .ess_weave가 표시되지 않습니다. 아마도 몇몇 자식은 다시 엉망이된다. 13.09에서는 고정되어 있지 않습니다. 지금 고치세요. 죄송합니다.]

+0

특히,'knitr'은'knit (..., envir = globalenv())'(가끔은 부모)를 제외하고는 기본적으로'parent.frame()'의 코드를 평가합니다.frame()'은 단지'globalenv()'이고, 가끔은 그렇지 않습니다.) –

+0

당신이 이것을 고쳤다 니. 감사! @ Yihui의 주석에 따라 필자는'$ EMACS_HOME/site-lisp/ess/etc/ESSR.R "'에서'.ess_weave()'를 편집하여'envir = parent 'knit()'의 디폴트 인'envir = parent.frame()'이 아니라'.files (2)'('command (file, envir = parent.frame (2))'와 같다. (나는 요즘 ** knitr ** 사용자 일 뿐이므로 Sweave로 편집하는 방법을 잘 모릅니다.) –

+0

답변 해 주셔서 감사합니다! 'ess-swv-processing-command'를 설정하는 것은 나에게 도움이되지 못했지만 지금 당장'envir = globalenv() '를 사용하려고합니다. 개발 버전으로 전환하고 싶지는 않다고 생각하지만, 업스트림 ESS를 매 (hawk)처럼 보겠습니다 :-) –

6

대화 형 R 세션을 연 다음 Sweave를 직접 호출하면이 (테스트되지는 않았지만)이라고 생각합니다. knitr은 같은 방법으로 작동하지만, 먼저 knitr 라이브러리를로드해야합니다.

> Sweave("yourfile.Rnw") 

여기에도 위험이 있습니다. 다른 작업을 수행 한 후 세션에서 Sweave를 호출하면 코드가 작업 영역에서 이전에 사용한 것을 사용할 수 있으므로 결과를 재현 할 수 없게됩니다.

+0

그건 다소 진흙탕 같지만 적어도 작동합니다. 올바른 knitr 방법은 knitr :: knit ("file.Rnw") 인 것 같습니다. 재현성을 위해,'rm (list = ls())'를 먼저 써야한다. 그래서 오래된 객체가 간섭하지 않도록한다. 그래서 내 유일한 옵션은 이것을 어떻게 든 지름길에 묶는 것입니다 ... –

+0

제가보기에, 당신이 이것을 위해 ESS 키 바인딩을 찾고 있다는 것을 깨닫지 못했습니다. 다행이 당신을 위해 또 다른 대답을 찾았다는 소식을 듣고 싶습니다. – Aaron