2016-11-30 2 views
4

Минимальный документ Rmarkdown имеет заголовок YAML, синтаксис разметки и фрагменты кода R. Для редактирования такого многоязычного файла я использую редактор Emacs, а буфер, в котором открыт документ Rmd, находится в polymode.выполнить все R-фрагменты сразу из документа Rmd

Типичный документ имеет более одного фрагмента R. Когда я пишу/отлаживаю фрагмент R в середине документа Rmd, у меня есть второй буфер в режиме ESS, где R работает внутри, и мне часто приходится повторно выполнять все предыдущие фрагменты, отправив команды R из Rmd файл (1-й буфер) в консоль R (второй буфер).

Есть ли одна команда, позволяющая выполнять все команды из всех кусков?

От another question, похоже, org-mode может это сделать. Но можно ли это сделать в моих условиях?

ответ

3

Если у вас есть только исходный код R в Rmarkdown и вы хотите, чтобы он мог легко оценить его, spin от knitr может быть проще (see here).

Я предпочитаю это (спин) решение, так как все уценки/Rmarkdown mumbo-jumbo содержатся в нормальных комментариях 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'; загрузите его в Emacs через 'M-x load-file'; откройте файл '.Rmd' с R-фрагментами в буфер« полимед »; открыть буфер ESS; поместите курсор где-нибудь в середину буфера «polymode»; выполнить 'C-u M-x rmd-send-buffer'. Это отправит все R-фрагменты над курсором из буфера «polymode» в буфер «ESS». – tflutre