org-babel: capture graphical output from R

If a [:file filename.ext] header arg is provided, then all graphical
output from the source block is captured on disk, and output of the
source block is a link to the resulting file, as with the
graphics-only languages such as gnuplot, ditaa, dot, asymptote. An
attempt is made to find a graphics device corresponding to the file
extension (currently .png, .jpg, .jpeg, .tiff, .bmp, .pdf, .ps,
.postscript are recognised); if that fails, png format output is
created.

Additionally, values for several arguments to the R graphics
device can be passed using header args:

:width :height :bg :units :pointsize
:antialias :quality :compression :res :type
:family :title :fonts :version :paper :encoding
:pagecentre :colormodel :useDingbats :horizontal

Arguments to the R graphics device that are not supported as header
args can be passed as a string in R argument syntax, using the header
arg :R-dev-args

An example block is (although both bg and fg can be passed directly as
header args)

\#+begin_src R :file z.pdf :width 8 :height 8 :R-dev-args bg="olivedrab", fg="hotpink"
  plot(matrix(rnorm(100), ncol=2), type="l")
\#+end_src
This commit is contained in:
Dan Davison 2009-10-19 21:00:24 -04:00
parent 4d374b27d2
commit 8b52bf09e0
1 changed files with 36 additions and 8 deletions

View File

@ -40,14 +40,17 @@
called by `org-babel-execute-src-block' via multiple-value-bind."
(message "executing R source code block...")
(save-window-excursion
(let ((full-body (concat
(mapconcat ;; define any variables
(lambda (pair)
(org-babel-R-assign-elisp (car pair) (cdr pair)))
vars "\n") "\n" body "\n"))
(session (org-babel-R-initiate-session session))
(column-names-p (cdr (assoc :colnames params))))
(org-babel-R-evaluate session full-body result-type column-names-p))))
(let* ((session (org-babel-R-initiate-session session))
(column-names-p (cdr (assoc :colnames params)))
(out-file (cdr (assoc :file params)))
(augmented-body
(concat
(if out-file (concat (org-babel-R-construct-graphics-device-call out-file params) "\n") "")
(mapconcat ;; define any variables
(lambda (pair) (org-babel-R-assign-elisp (car pair) (cdr pair))) vars "\n")
"\n" body "\n" (if out-file "dev.off()\n" "")))
(result (org-babel-R-evaluate session augmented-body result-type column-names-p)))
(or out-file result))))
(defun org-babel-prep-session:R (session params)
"Prepare SESSION according to the header arguments specified in PARAMS."
@ -87,6 +90,31 @@ called by `org-babel-execute-src-block' via multiple-value-bind."
(rename-buffer (if (bufferp session) (buffer-name session)
(if (stringp session) session (buffer-name)))) (current-buffer)))))
(defun org-babel-R-construct-graphics-device-call (out-file params)
"Construct the call to the graphics device"
(let ((devices
'((:bmp . "bmp")
(:jpg . "jpeg")
(:jpeg . "jpeg")
(:tiff . "tiff")
(:png . "png")
(:pdf . "pdf")
(:ps . "postscript")
(:postscript . "postscript")))
(allowed-args '(:width :height :bg :units :pointsize
:antialias :quality :compression :res :type
:family :title :fonts :version :paper :encoding
:pagecentre :colormodel :useDingbats :horizontal))
(device (and (string-match ".+\\.\\([^.]+\\)" out-file) (match-string 1 out-file)))
(extra-args (cdr (assq :R-dev-args params))) filearg args)
(setq device (or (and device (cdr (assq (intern (concat ":" device)) devices))) "png"))
(setq filearg (if (member device '("pdf" "postscript")) "file" "filename"))
(setq args (mapconcat (lambda (pair)
(if (member (car pair) allowed-args)
(format ",%s=%s" (substring (symbol-name (car pair)) 1) (cdr pair)) ""))
params ""))
(format "%s(%s=\"%s\"%s%s%s)\n" device filearg out-file args (if extra-args "," "") (or extra-args ""))))
(defvar org-babel-R-eoe-indicator "'org_babel_R_eoe'")
(defvar org-babel-R-eoe-output "[1] \"org_babel_R_eoe\"")
(defvar org-babel-R-wrapper-method "main <- function ()\n{\n%s\n}