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

tfl*_*tre 5 emacs r ess r-markdown

最小的Rmarkdown文档具有YAML标头,降价语法和R代码块。编写这样一个多语言文件,我使用Emacs编辑器,并在其中RMD文档被打开的缓冲区,在polymode

一个典型的文档有多个R块。当我在Rmd文档的中间编写/调试R块时,我在ESS模式下有第二个缓冲区,内部运行着R,并且我经常不得不通过从Rmd发送R命令来重新执行所有先前的块文件(第一个缓冲区)放入R控制台(第二个缓冲区)。

是否有一个命令可以执行所有块中的所有命令?

另一个问题来看,似乎org-mode可以做到这一点。但是可以在我的环境中做到吗?

pic*_*ick 5

如果您的 Rmarkdown 中只有 R 源代码,并且希望能够轻松地对其进行交互式评估,那么spinfromknitr可能会更容易(请参阅此处)。

我更喜欢那个 (spin) 解决方案,因为所有的 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))))))
Run Code Online (Sandbox Code Playgroud)


Dom*_*omQ 5

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

参考