2016-11-30 4 views
4

Ein minimales Rmarkdown Dokument hat einen YAML-Header, Markdown-Syntax und R-Code-Chunks. Um eine solche mehrsprachige Datei zu bearbeiten, verwende ich den Emacs-Editor, und der Puffer, in dem das Rmd-Dokument geöffnet ist, ist in polymode.Alle R-Chunks auf einmal aus einem Rmd-Dokument ausführen

Ein typisches Dokument hat mehr als ein R-Chunk. Wenn ich einen R-Chunk in der Mitte des Rmd-Dokuments schreibe/debugge, habe ich einen zweiten Puffer im ESS-Modus, in dem R läuft, und ich muss oft alle vorherigen Chunks erneut ausführen, indem ich die R-Befehle von Rmd sende Datei (1. Puffer) in die R-Konsole (2. Puffer).

Gibt es einen einzigen Befehl, mit dem alle Befehle aller Chunks ausgeführt werden können?

Von another question scheint es, als ob org-mode dies tun kann. Aber wäre es möglich, es in meiner Umgebung zu tun?

Antwort

3

Wenn Sie nur R-Quellcode in Ihren Rmarkdown haben, und wollen in der Lage sein, interaktiv es leicht zu bewerten, spin von knitr könnte einfacher sein (see here).

Ich bevorzuge diese (Spin) Lösung, da der gesamte Markdown/Rmarkdown-Hokuspokus in normalen R-Kommentaren enthalten ist, so dass der Puffer wie normaler Quellcode behandelt werden kann. Aber das Folgende sollte alle R-Code-Stücke in einem Polymodepuffer auswerten (nicht gründlich getestet).

(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)))))) 
+0

genial ... !! Würde es eine Möglichkeit geben, die Chunks nur dort zu senden, wo sich der Cursor befindet? Das heißt, angenommen, es gibt 10 Chunks in dem Rmd-Puffer, und der Cursor befindet sich zwischen dem 5. und 6.. Gibt es eine Möglichkeit, nur die Chunks 1 bis 5 an den ESS-Puffer zu senden? – tflutre

+0

Danke! Für die Neulinge wie mich, hier ist, wie man es benutzt: Speichern Sie die Funktionen in eine '.el' Datei; lade es über 'M-x load-file' in Emacs; öffne eine '.Rmd'-Datei mit R-Chunks in einen' polymode'-Puffer; Öffne einen "ESS" -Puffer; Setzen Sie den Cursor irgendwo in die Mitte des 'polymode'-Puffers; führe 'C-u M-x rmd-Sendepuffer 'aus. Dies wird alle R-Stücke oberhalb des Cursors von dem "Polymode" -Puffer in den "ESS" -Puffer senden. – tflutre

Verwandte Themen