| 
					
				 | 
			
			
				@@ -158,6 +158,7 @@ This function is called by `org-babel-execute-src-block'." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   (save-excursion 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     (let* ((result-params (cdr (assq :result-params params))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	   (result-type (cdr (assq :result-type params))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+           (async (org-babel-comint-use-async params)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            (session (org-babel-R-initiate-session 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		     (cdr (assq :session params)) params)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	   (graphics-file (and (member "graphics" (assq :result-params params)) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -184,7 +185,8 @@ This function is called by `org-babel-execute-src-block'." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		  (cdr (assq :colname-names params)) colnames-p)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	     (or (equal "yes" rownames-p) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		 (org-babel-pick-name 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		  (cdr (assq :rowname-names params)) rownames-p))))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		  (cdr (assq :rowname-names params)) rownames-p)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             async))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       (if graphics-file nil result)))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 (defun org-babel-prep-session:R (session params) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -371,11 +373,14 @@ Has four %s escapes to be filled in: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 4. The name of the file to write to") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 (defun org-babel-R-evaluate 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  (session body result-type result-params column-names-p row-names-p) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  (session body result-type result-params column-names-p row-names-p async) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   "Evaluate R code in BODY." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   (if session 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      (if async 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          (ob-session-async-org-babel-R-evaluate-session 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+           session body result-type result-params column-names-p row-names-p) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       (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)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     (org-babel-R-evaluate-external-process 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      body result-type result-params column-names-p row-names-p))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -468,6 +473,85 @@ Insert hline if column names in output have been requested." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	(error "Could not parse R result")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     result)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+;;; async evaluation 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+(defconst ob-session-async-R-indicator "'ob_comint_async_R_%s_%s'") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+(defun ob-session-async-org-babel-R-evaluate-session 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    (session body result-type result-params column-names-p row-names-p) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  "Asynchronously evaluate BODY in SESSION. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Returns a placeholder string for insertion, to later be replaced 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+by `org-babel-comint-async-filter'." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  (org-babel-comint-async-register 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   session (current-buffer) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   "^\\(?:[>.+] \\)*\\[1\\] \"ob_comint_async_R_\\(.+?\\)_\\(.+\\)\"$" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   'org-babel-chomp 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   'ob-session-async-R-value-callback) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  (cl-case result-type 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    (value 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     (let ((tmp-file (org-babel-temp-file "R-"))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+       (with-temp-buffer 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         (insert 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          (org-babel-chomp body)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         (let ((ess-local-process-name 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                (process-name (get-buffer-process session)))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+           (ess-eval-buffer nil))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+       (with-temp-buffer 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 (insert 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	  (mapconcat 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+           'org-babel-chomp 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+           (list (format org-babel-R-write-object-command 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         (if row-names-p "TRUE" "FALSE") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         (if column-names-p 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                             (if row-names-p "NA" "TRUE") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                           "FALSE") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         ".Last.value" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         (org-babel-process-file-name tmp-file 'noquote)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                 (format ob-session-async-R-indicator 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                         "file" tmp-file)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+           "\n")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 (let ((ess-local-process-name 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		(process-name (get-buffer-process session)))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	   (ess-eval-buffer nil))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+       tmp-file)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    (output 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     (let ((uuid (md5 (number-to-string (random 100000000)))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+           (ess-local-process-name 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            (process-name (get-buffer-process session)))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+       (with-temp-buffer 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         (insert (format ob-session-async-R-indicator 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					  "start" uuid)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         (insert "\n") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         (insert body) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         (insert "\n") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         (insert (format ob-session-async-R-indicator 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					  "end" uuid)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         (ess-eval-buffer nil)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+       uuid)))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+(defun ob-session-async-R-value-callback (params tmp-file) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  "Callback for async value results. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Assigned locally to `ob-session-async-file-callback' in R 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+comint buffers used for asynchronous Babel evaluation." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  (let* ((graphics-file (and (member "graphics" (assq :result-params params)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			     (org-babel-graphical-output-file params))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 (colnames-p (unless graphics-file (cdr (assq :colnames params))))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    (org-babel-R-process-value-result 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     (org-babel-result-cond (assq :result-params params) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+       (with-temp-buffer 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         (insert-file-contents tmp-file) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         (org-babel-chomp (buffer-string) "\n")) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+       (org-babel-import-elisp-from-file tmp-file '(16))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     (or (equal "yes" colnames-p) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 (org-babel-pick-name 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	  (cdr (assq :colname-names params)) colnames-p))))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+;;; ob-session-async-R.el ends here 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 (provide 'ob-R) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ;;; ob-R.el ends here 
			 |