从 Rmd 文档一次执行所有 R 块

execute all R chunks at once from an Rmd document

一个最小的 Rmarkdown 文档有一个 YAML header、markdown 语法和 R 代码块。 要编辑这样一个 multi-language 文件,我使用的是 Emacs 编辑器,打开 Rmd 文档的缓冲区在 polymode.

典型的文档有多个 R 块。当我在 Rmd 文档中间 writing/debugging 一个 R chunk 时,我在 ESS 模式下有第二个缓冲区,里面有 R 运行 ,我经常要 re-execute 所有前面的 chunk通过将 R 命令从 Rmd 文件(第一个缓冲区)发送到 R 控制台(第二个缓冲区)。

是否有一个命令允许执行来自所有块的所有命令?

看来,org-mode好像可以做到这一点。但是在我的设置中可以这样做吗?

如果您的 Rmarkdown 中只有 R 源代码,并且希望能够轻松地对其进行交互式评估,knitr 中的 spin 可能更容易 (see here)。

我更喜欢那个(自旋)解决方案,因为所有 markdown/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))))))

如果使用 Poly-Markdown+R,评估 Rmarkdown 文档中所有 R 代码片段的命令是 M-n v b

Reference