выполнить все фрагменты R одновременно из документа Rmd

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

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

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

Из другого вопроса похоже, что org-mode может это сделать. Но возможно ли это сделать в моих условиях?


person tflutre    schedule 30.11.2016    source источник


Ответы (2)


При использовании Poly-Markdown+R команда для оценки всех фрагментов R в документе Rmarkdown — M-n v b .

Справочник

person DomQ    schedule 15.09.2019
comment
Кредит @kaz_yos fpr указывает на проблему 3; Я просто пошел оттуда и щелкнул пару ссылок, чтобы найти ответ. - person DomQ; 15.09.2019

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

Я предпочитаю это (спиновое) решение, так как вся ерунда 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))))))
person Rorschach    schedule 05.12.2016
comment
Потрясающие...!! Есть ли способ отправить только фрагменты выше, где находится курсор? То есть предположим, что в буфере Rmd 10 фрагментов, а курсор находится между 5-м и 6-м. Есть ли способ отправить в буфер ESS только фрагменты с 1 по 5? - person tflutre; 07.12.2016
comment
Спасибо! Для таких новичков, как я, вот как это использовать: сохраните функции в файл .el; загрузить его в Emacs через M-x load-file; открыть файл .Rmd с фрагментами R в буфер polymode; открыть буфер ESS; поставить курсор где-нибудь в середине буфера polymode; выполнить C-u M-x rmd-send-buffer. Это отправит все фрагменты R над курсором из буфера polymode в буфер ESS. - person tflutre; 07.12.2016
comment
После обновления polymode (недавний рефакторинг) эти функции больше не работают: pm-map-over-spans: Wrong number of arguments: (lambda nil "Send current R chunk to ess process." (interactive) (and (eq (eieio-oref pm/chunkmode (quote :mode)) (quote r-mode)) (save-restriction (pm-narrow-to-span nil) (goto-char (point-min)) (forward-line) (ess-eval-region (point) (point-max) nil nil (quote R))))), 1. Я пытался отлаживать, но недостаточно знаю Лисп. У тебя случайно нет решения? - person tflutre; 05.10.2018