2016-11-30 5 views
4

최소 Rmarkdown 문서에는 YAML 헤더, 마크 다운 구문 및 R 코드 청크가 있습니다. 다중 언어 파일을 편집하려면 Emacs 편집기를 사용하고 Rmd 문서가 열리는 버퍼는 polymode입니다.Rmd 문서에서 한 번에 모든 R 청크를 실행

일반적인 문서에는 두 개 이상의 R 청크가 있습니다. Rmd 문서 중간에 R 청크를 작성/디버깅 할 때 R이 내부에서 실행중인 ESS 모드의 두 번째 버퍼가 있으며 Rmd에서 R 명령을 보내 모든 이전 청크를 재실행해야하는 경우가 있습니다 파일 (첫 번째 버퍼)을 R 콘솔에 연결합니다 (두 번째 버퍼).

모든 청크의 모든 명령을 실행할 수있는 단일 명령이 있습니까?

another question에서 보면 org-mode가이를 수행 할 수있는 것 같습니다. 하지만 제 설정대로 할 수 있습니까?

답변

3

귀하의 Rmarkdown에만 R 소스 코드가 있고 대화식으로 쉽게 평가할 수 있도록하려면 knitr에서 spin이 더 쉬울 수도 있습니다 (see here).

나는 모든 markdown/Rmarkdown 불필요한 점보가 정상적인 R 주석에 포함되어 있기 때문에 버퍼를 일반 소스 코드처럼 취급 할 수 있으므로 (스핀) 솔루션을 선호합니다. 그러나 다음은 폴리 모드 버퍼의 모든 R 코드 청크를 평가해야합니다 (철저하게 테스트하지는 않음).

(eval-when-compile 
    (require 'polymode-core) ;; SO format :(' 
    (defvar pm/chunkmode)) 
(declare-function pm-map-over-spans "polymode-core") 
(declare-function pm-narrow-to-span "polymode-core") 

(defun rmd-send-chunk() 
    "Send current R chunk to ess process." 
    (interactive) 
    (and (eq (oref pm/chunkmode :mode) 'r-mode) ;;' 
     (pm-with-narrowed-to-span nil 
     (goto-char (point-min)) 
     (forward-line) 
     (ess-eval-region (point) (point-max) nil nil 'R)))) ;;' 

(defun rmd-send-buffer (arg) 
    "Send all R code blocks in buffer to ess process. With prefix 
send regions above point." 
    (interactive "P") 
    (save-restriction 
    (widen) 
    (save-excursion 
     (pm-map-over-spans 
     'rmd-send-chunk (point-min) ;;' 
     ;; adjust this point to send prior regions 
     (if arg (point) (point-max)))))) 
+0

awesome ... !! 커서가있는 위의 청크 만 보낼 수있는 방법이 있을까요? 즉, Rmd 버퍼에 10 개의 청크가 있고 커서가 5와 6 사이에 있다고 가정합니다. ESS 버퍼에 청크 1 - 5 만 보낼 수 있습니까? – tflutre

+0

감사! 나 같은 초보자들을 위해, 그것을 사용하는 방법이 있습니다 : 함수를'.el' 파일로 저장하십시오; 'M-x load-file'을 통해 Emacs로로드하십시오; R 청크가있는'.Rmd' 파일을'polymode' 버퍼에 저장하십시오; 'ESS' 버퍼를 엽니 다. 커서를'polymode' 버퍼의 중간에 놓으십시오; 'C-u M-x rmd-send-buffer'를 실행하십시오. 그러면 커서 위의 모든 R 청크가'polymode' 버퍼에서'ESS' 버퍼로 보내집니다. – tflutre

관련 문제