mirror of
https://git.savannah.gnu.org/git/emacs/org-mode.git
synced 2024-09-30 01:27:53 +00:00
babel: R: Refactor evaluation code
* ob-R.el (org-babel-R-evaluate): Break the two branches into two separate functions (org-babel-R-evaluate-external-process): New function to handle external process evaluation (org-babel-R-evaluate-session): New function to handle session evaluation
This commit is contained in:
parent
66ca61126c
commit
bf64d25744
127
lisp/ob-R.el
127
lisp/ob-R.el
|
@ -219,63 +219,76 @@ write.table(main(), file=\"%s\", sep=\"\\t\", na=\"nil\",row.names=%s, col.names
|
|||
|
||||
(defun org-babel-R-evaluate
|
||||
(session body result-type column-names-p row-names-p)
|
||||
"Pass BODY to the R process in SESSION.
|
||||
If RESULT-TYPE equals 'output then return a list of the outputs
|
||||
of the statements in BODY, if RESULT-TYPE equals 'value then
|
||||
return the value of the last statement in BODY, as elisp."
|
||||
(if (not session)
|
||||
;; external process evaluation
|
||||
(case result-type
|
||||
(output (org-babel-eval org-babel-R-command body))
|
||||
(value
|
||||
(let ((tmp-file (make-temp-file "org-babel-R-results-")))
|
||||
(org-babel-eval org-babel-R-command
|
||||
(format org-babel-R-wrapper-method
|
||||
body tmp-file
|
||||
(if row-names-p "TRUE" "FALSE")
|
||||
(if column-names-p
|
||||
(if row-names-p "NA" "TRUE")
|
||||
"FALSE")))
|
||||
(org-babel-R-process-value-result
|
||||
(org-babel-import-elisp-from-file
|
||||
(org-babel-maybe-remote-file tmp-file) '(16)) column-names-p))))
|
||||
;; comint session evaluation
|
||||
(case result-type
|
||||
(value
|
||||
(let ((tmp-file (make-temp-file "org-babel-R"))
|
||||
broke)
|
||||
(org-babel-comint-with-output (session org-babel-R-eoe-output)
|
||||
(insert (mapconcat
|
||||
#'org-babel-chomp
|
||||
(list
|
||||
body
|
||||
(format org-babel-R-wrapper-lastvar
|
||||
tmp-file
|
||||
(if row-names-p "TRUE" "FALSE")
|
||||
(if column-names-p
|
||||
(if row-names-p "NA" "TRUE")
|
||||
"FALSE"))
|
||||
org-babel-R-eoe-indicator) "\n"))
|
||||
(inferior-ess-send-input))
|
||||
(org-babel-R-process-value-result
|
||||
(org-babel-import-elisp-from-file
|
||||
(org-babel-maybe-remote-file tmp-file) '(16)) column-names-p)))
|
||||
(output
|
||||
(mapconcat
|
||||
#'org-babel-chomp
|
||||
(butlast
|
||||
(delq nil
|
||||
(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)))) 2) "\n")))))
|
||||
"Evaluate R code in BODY."
|
||||
(if session
|
||||
(org-babel-R-evaluate-session
|
||||
session body result-type column-names-p row-names-p)
|
||||
(org-babel-R-evaluate-external-process
|
||||
body result-type column-names-p row-names-p)))
|
||||
|
||||
(defun org-babel-R-evaluate-external-process
|
||||
(body result-type column-names-p row-names-p)
|
||||
"Evaluate BODY in external R process.
|
||||
If RESULT-TYPE equals 'output then return standard output as a
|
||||
string. If RESULT-TYPE equals 'value then return the value of the
|
||||
last statement in BODY, as elisp."
|
||||
(case result-type
|
||||
(value
|
||||
(let ((tmp-file (make-temp-file "org-babel-R-results-")))
|
||||
(org-babel-eval org-babel-R-command
|
||||
(format org-babel-R-wrapper-method
|
||||
body tmp-file
|
||||
(if row-names-p "TRUE" "FALSE")
|
||||
(if column-names-p
|
||||
(if row-names-p "NA" "TRUE")
|
||||
"FALSE")))
|
||||
(org-babel-R-process-value-result
|
||||
(org-babel-import-elisp-from-file
|
||||
(org-babel-maybe-remote-file tmp-file) '(16)) column-names-p)))
|
||||
(output (org-babel-eval org-babel-R-command body))))
|
||||
|
||||
(defun org-babel-R-evaluate-session
|
||||
(session body result-type 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
|
||||
last statement in BODY, as elisp."
|
||||
(case result-type
|
||||
(value
|
||||
(let ((tmp-file (make-temp-file "org-babel-R"))
|
||||
broke)
|
||||
(org-babel-comint-with-output (session org-babel-R-eoe-output)
|
||||
(insert (mapconcat
|
||||
#'org-babel-chomp
|
||||
(list
|
||||
body
|
||||
(format org-babel-R-wrapper-lastvar
|
||||
tmp-file
|
||||
(if row-names-p "TRUE" "FALSE")
|
||||
(if column-names-p
|
||||
(if row-names-p "NA" "TRUE")
|
||||
"FALSE"))
|
||||
org-babel-R-eoe-indicator) "\n"))
|
||||
(inferior-ess-send-input))
|
||||
(org-babel-R-process-value-result
|
||||
(org-babel-import-elisp-from-file
|
||||
(org-babel-maybe-remote-file tmp-file) '(16)) column-names-p)))
|
||||
(output
|
||||
(mapconcat
|
||||
#'org-babel-chomp
|
||||
(butlast
|
||||
(delq nil
|
||||
(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)))) 2) "\n"))))
|
||||
|
||||
(defun org-babel-R-process-value-result (result column-names-p)
|
||||
"R-specific processing of return value.
|
||||
|
|
Loading…
Reference in a new issue