tfl*_*tre 5 emacs r ess r-markdown
最小的Rmarkdown文档具有YAML标头,降价语法和R代码块。编写这样一个多语言文件,我使用Emacs编辑器,并在其中RMD文档被打开的缓冲区,在polymode。
一个典型的文档有多个R块。当我在Rmd文档的中间编写/调试R块时,我在ESS模式下有第二个缓冲区,内部运行着R,并且我经常不得不通过从Rmd发送R命令来重新执行所有先前的块文件(第一个缓冲区)放入R控制台(第二个缓冲区)。
是否有一个命令可以执行所有块中的所有命令?
从另一个问题来看,似乎org-mode可以做到这一点。但是可以在我的环境中做到吗?
如果您的 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)