summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron Ecay <aaronecay@gmail.com>2014-08-07 01:51:37 -0400
committerAaron Ecay <aaronecay@gmail.com>2014-08-07 01:54:23 -0400
commitb51746332dca87a35c387b2db0bb678b4c24a4da (patch)
tree6ba55f5b6ebc41305772c22079dda99298073b5e
parentd035c1476537ca93594bf07ed2faebca2dafade3 (diff)
downloadorg-mode-b51746332dca87a35c387b2db0bb678b4c24a4da.tar.gz
ob-R.el: Improve the capturing of output-type results in sessions.
* lisp/ob-R.el (org-babel-R-evaluate-session): Improve the capturing of R output. This uses a built-in facility of R to write the output to a file, rather than trying to capture it in an emacs buffer using ESS (a process by which the output can get mixed with other irrelevant text, such as R command prompts).
-rw-r--r--lisp/ob-R.el33
1 files changed, 15 insertions, 18 deletions
diff --git a/lisp/ob-R.el b/lisp/ob-R.el
index 9f4eb4b..a7965af 100644
--- a/lisp/ob-R.el
+++ b/lisp/ob-R.el
@@ -365,7 +365,7 @@ last statement in BODY, as elisp."
(defvar ess-eval-visibly-p)
(defun org-babel-R-evaluate-session
- (session body result-type result-params column-names-p row-names-p)
+ (session body result-type result-params column-names-p row-names-p)
"Evaluate BODY in SESSION.
If RESULT-TYPE equals 'output then return standard output as a
string. If RESULT-TYPE equals 'value then return the value of the
@@ -395,23 +395,20 @@ last statement in BODY, as elisp."
(org-babel-import-elisp-from-file tmp-file '(16)))
column-names-p)))
(output
- (mapconcat
- 'org-babel-chomp
- (butlast
- (delq nil
- (mapcar
- (lambda (line) (when (> (length line) 0) line))
- (mapcar
- (lambda (line) ;; cleanup extra prompts left in output
- (if (string-match
- "^\\([ ]*[>+\\.][ ]?\\)+\\([[0-9]+\\|[ ]\\)" line)
- (substring line (match-end 1))
- line))
- (org-babel-comint-with-output (session org-babel-R-eoe-output)
- (insert (mapconcat 'org-babel-chomp
- (list body org-babel-R-eoe-indicator)
- "\n"))
- (inferior-ess-send-input)))))) "\n"))))
+ (let* ((output-file (org-babel-temp-file "R-"))
+ (sentinel-file (concat output-file "-sentinel")))
+ (org-babel-comint-eval-invisibly-and-wait-for-file
+ session sentinel-file
+ (format "capture.output({%s}, file=%S); file.create(%S)"
+ (org-babel-chomp body)
+ output-file
+ sentinel-file))
+ (with-temp-buffer
+ (insert-file-contents output-file)
+ (goto-char (point-min))
+ (flush-lines "^$")
+ (delete-trailing-whitespace)
+ (buffer-string))))))
(defun org-babel-R-process-value-result (result column-names-p)
"R-specific processing of return value.