【问题标题】:execute all R chunks at once from an Rmd document从 Rmd 文档一次执行所有 R 块
【发布时间】:2017-04-15 02:53:58
【问题描述】:

最小的Rmarkdown 文档具有 YAML 标头、markdown 语法和 R 代码块。 编辑这样的多语言文件,我使用的是 Emacs 编辑器,打开 Rmd 文档的缓冲区在polymode

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

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

来自another question,似乎 org-mode 可以做到这一点。但是在我的环境下可以做到吗?

【问题讨论】:

    标签: r emacs r-markdown ess


    【解决方案1】:

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

    Reference

    【讨论】:

    • 感谢@kaz_yos fpr 指出问题3;我只是从那里开始并单击了几个链接以找到答案。
    【解决方案2】:

    如果您的 Rmarkdown 中只有 R 源代码,并且希望能够轻松地以交互方式评估它,那么来自 knitrspin 可能会更容易 (see here)。

    我更喜欢那个 (spin) 解决方案,因为所有的 markdown/Rmarkdown mumbo-jumbo 都包含在正常的 R cmets 中,所以可以将缓冲区视为常规源代码。但是,以下应该评估多模式缓冲区中的所有 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))))))
    

    【讨论】:

    • 太棒了……!!有没有办法只发送光标所在位置上方的块?即假设 Rmd 缓冲区中有 10 个块,并且光标在第 5 和第 6 之间。有没有办法只将块 1 到 5 发送到 ESS 缓冲区?
    • 谢谢!对于像我这样的新手,这里是如何使用它:将函数保存到.el文件中;通过M-x load-file 将其加载到 Emacs 中;在polymode缓冲区中打开一个带有R块的.Rmd文件;打开ESS 缓冲区;将光标放在polymode 缓冲区的中间某处;执行C-u M-x rmd-send-buffer。这会将光标上方的所有 R 块从 polymode 缓冲区发送到 ESS 缓冲区。
    • 更新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。我尝试调试但对 Lisp 了解不够。万一,你有解决办法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    • 2015-12-30
    • 2013-10-21
    • 1970-01-01
    • 2014-09-05
    相关资源
    最近更新 更多