* Help debugging R source code block output problem with :session @ 2020-08-28 20:11 Dylan Schwilk 2020-08-29 2:36 ` Jack Kamm 0 siblings, 1 reply; 25+ messages in thread From: Dylan Schwilk @ 2020-08-28 20:11 UTC (permalink / raw) To: emacs-orgmode I returned to an org file this week and found that I am getting some strange source code block output for R code when I use the :session header. I have been able to duplicate this with a minimal init file. I strongly suspect it is some problem at my end but perhaps folks here can help me know here to look? It occurs with a minimal emacs initialization. First, here is a small org file example of the problem. In the second results block the ">" appears to be treated as a prompt line to strip from output but only when a session is started. This happens with any ">" in output when the :session header occurs. the problem is dramatic when printing tibbles where the column modes are enclosed in angle brackets. test.org >>> ** Test org babel R output prompt problem #+begin_src R :results output print("<X> <Y> <!>") print("one <two> three") print("end") #+end_src #+RESULTS: : [1] "<X> <Y> <!>" : [1] "one <two> three" : [1] "end" #+begin_src R :results output :session "NEW" print("<X> <Y> <!>") print("one <two> three") print("end") #+end_src #+RESULTS: : [1] "< : < : <!>" : [1] "one < : three" : [1] "end" <<< The second block produces the bad output. This occurs with a minimal setup. I start emacs with > emacs -Q -l "~/debugorg.el" where debugorg.el is: >> require 'package) add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t) add-to-list 'package-archives '("org" . "https://orgmode.org/elpa/") t) package-initialize) require 'ess-site) (org-babel-do-load-languages 'org-babel-load-languages '((R . t))) << emacs version 26.3 org-mode version 9.3.7 ess version 18.10.3snapshot -- ^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Help debugging R source code block output problem with :session 2020-08-28 20:11 Help debugging R source code block output problem with :session Dylan Schwilk @ 2020-08-29 2:36 ` Jack Kamm 2020-08-29 4:07 ` Dylan Schwilk 0 siblings, 1 reply; 25+ messages in thread From: Jack Kamm @ 2020-08-29 2:36 UTC (permalink / raw) To: Dylan Schwilk, emacs-orgmode [-- Attachment #1: Type: text/plain, Size: 744 bytes --] Hi Dylan, I'm able to reproduce your error. I think this same bug has been previously reported at [1]. As discussed there, the reason is that substrings ending in ">" get stripped out by org-babel-comint-with-output because it thinks they are prompts (in particular, they match comint-prompt-regexp). I'm attaching a patch to solve the issue. It replaces org-babel-comint-with-output, with an R call to capture.output. I think this approach is simpler and more robust, since it doesn't need to do any parsing to remove prompts or other unwanted outputs. I haven't committed to ob-R.el before, so thought it would be best to solicit feedback here before merging this in. Cheers, Jack [1] https://orgmode.org/list/875zgjh8wn.fsf@gmail.com/ [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: 0001-ob-R-Fix-prompt-mangling-in-session-output.patch --] [-- Type: text/x-patch, Size: 3698 bytes --] From 1dc8e2d2cb01a4e6b82342ea8d8c965df8f5222c Mon Sep 17 00:00:00 2001 From: Jack Kamm <jackkamm@gmail.com> Date: Fri, 28 Aug 2020 19:16:05 -0700 Subject: [PATCH] ob-R: Fix prompt mangling in session output * lisp/ob-R.el (org-babel-R-evaluate-session): Replace call to org-babel-comint-with-output with ess-send-to-buffer and additional wrapper R code. Fixes https://orgmode.org/list/875zgjh8wn.fsf@gmail.com/ and https://orgmode.org/list/87r1rqled0.fsf@havana/ --- lisp/ob-R.el | 79 ++++++++++++++++++++++++---------------------------- 1 file changed, 36 insertions(+), 43 deletions(-) diff --git a/lisp/ob-R.el b/lisp/ob-R.el index 5e9d35f58..d69cf23db 100644 --- a/lisp/ob-R.el +++ b/lisp/ob-R.el @@ -412,49 +412,42 @@ (defun org-babel-R-evaluate-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." - (cl-case result-type - (value - (with-temp-buffer - (insert (org-babel-chomp body)) - (let ((ess-local-process-name - (process-name (get-buffer-process session))) - (ess-eval-visibly-p nil)) - (ess-eval-buffer nil))) - (let ((tmp-file (org-babel-temp-file "R-"))) - (org-babel-comint-eval-invisibly-and-wait-for-file - session tmp-file - (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))) - (org-babel-R-process-value-result - (org-babel-result-cond result-params - (with-temp-buffer - (insert-file-contents tmp-file) - (org-babel-chomp (buffer-string) "\n")) - (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 - "^\\([>+.]\\([ ][>.+]\\)*[ ]\\)" - (car (split-string line "\n"))) - (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 ((ess-local-process-name + (process-name (get-buffer-process session))) + (ess-eval-visibly-p nil)) + (cl-case result-type + (value + (with-temp-buffer + (insert (org-babel-chomp body)) + (ess-eval-buffer nil)) + (let ((tmp-file (org-babel-temp-file "R-"))) + (org-babel-comint-eval-invisibly-and-wait-for-file + session tmp-file + (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))) + (org-babel-R-process-value-result + (org-babel-result-cond result-params + (with-temp-buffer + (insert-file-contents tmp-file) + (org-babel-chomp (buffer-string) "\n")) + (org-babel-import-elisp-from-file tmp-file '(16))) + column-names-p))) + (output + (let ((tmp-file (org-babel-temp-file "R-"))) + (with-temp-buffer + (insert (format "capture.output({ +%s +}, file='%s')" + body tmp-file)) + (ess-eval-buffer)) + (ess-wait-for-process) + (with-temp-buffer + (insert-file-contents tmp-file) + (buffer-string))))))) (defun org-babel-R-process-value-result (result column-names-p) "R-specific processing of return value. -- 2.28.0 ^ permalink raw reply related [flat|nested] 25+ messages in thread
* Re: Help debugging R source code block output problem with :session 2020-08-29 2:36 ` Jack Kamm @ 2020-08-29 4:07 ` Dylan Schwilk 2020-08-29 7:24 ` Jack Kamm 0 siblings, 1 reply; 25+ messages in thread From: Dylan Schwilk @ 2020-08-29 4:07 UTC (permalink / raw) To: Jack Kamm; +Cc: emacs-orgmode Hi Jack, The patch does fix that issue -- but it introduces a different bug for code blocks with ~:session~: the R block now only produces output from the last statement evaluated. #+begin_src R :results output :exports both :session 4.0 * 3.5 log(10) # natural log log10(10) (3 + 1) * 5 3^-1 1/0 #+end_src #+results: : [1] Inf Without the ~:session header~ the output is as it was before the patch: #+results: : [1] 14 : [1] 2.302585 : [1] 1 : [1] 20 : [1] 0.3333333 : [1] Inf -Dylan ^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Help debugging R source code block output problem with :session 2020-08-29 4:07 ` Dylan Schwilk @ 2020-08-29 7:24 ` Jack Kamm 2020-08-29 20:35 ` Berry, Charles via General discussions about Org-mode. ` (2 more replies) 0 siblings, 3 replies; 25+ messages in thread From: Jack Kamm @ 2020-08-29 7:24 UTC (permalink / raw) To: Dylan Schwilk; +Cc: emacs-orgmode [-- Attachment #1: Type: text/plain, Size: 1125 bytes --] Hi Dylan, > The patch does fix that issue -- but it introduces a different bug > for code blocks with ~:session~: the R block now only produces > output from the last statement evaluated. Of course, you're right. Good catch. Here's another attempt. It fixes the issue by modifying the R comint regular expression, requiring it to match at the beginning of the line. I think this should fix most cases, including the examples you sent. Still, it's not totally robust -- for example, it will still mangle multiline strings, if one of the lines starts with a substring that looks like a prompt. I'd be interested to hear if the attached patch works for the common cases you encounter, such as with tibbles. As an aside, I personally use an alternative implementation of ob-R sessions that doesn't suffer from this issue, and also provides some other benefits like async evaluation [1]. I'm planning to submit these changes to org-mode someday, but am not ready yet. But you may want to check it out, it was able to solve the issue in the other thread I linked as well. [1] https://github.com/jackkamm/ob-session-async [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: 0001-ob-R-Fix-prompt-mangling-in-session-output.patch --] [-- Type: text/x-patch, Size: 1505 bytes --] From 9eaf81d708f88d06f14f9b6b9cf4182dd0fbb997 Mon Sep 17 00:00:00 2001 From: Jack Kamm <jackkamm@gmail.com> Date: Sat, 29 Aug 2020 00:07:58 -0700 Subject: [PATCH] ob-R: Fix prompt mangling in session output * lisp/ob-R.el (org-babel-R-evaluate-session): Force comint prompt regexp to start at beginning of line, to prevent org-babel-comint-with-output from splitting mid-line. Fixes https://orgmode.org/list/875zgjh8wn.fsf@gmail.com/ and https://orgmode.org/list/87r1rqled0.fsf@havana/ --- lisp/ob-R.el | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/lisp/ob-R.el b/lisp/ob-R.el index 5e9d35f58..10b3b6fe3 100644 --- a/lisp/ob-R.el +++ b/lisp/ob-R.el @@ -450,11 +450,13 @@ (defun org-babel-R-evaluate-session (car (split-string line "\n"))) (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")))) + (with-current-buffer session + (let ((comint-prompt-regexp (concat "^" comint-prompt-regexp))) + (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")))) (defun org-babel-R-process-value-result (result column-names-p) "R-specific processing of return value. -- 2.28.0 ^ permalink raw reply related [flat|nested] 25+ messages in thread
* Re: Help debugging R source code block output problem with :session 2020-08-29 7:24 ` Jack Kamm @ 2020-08-29 20:35 ` Berry, Charles via General discussions about Org-mode. 2020-08-30 4:37 ` Dylan Schwilk ` (2 more replies) 2020-08-30 4:18 ` Dylan Schwilk 2021-05-03 8:53 ` Jeremie Juste 2 siblings, 3 replies; 25+ messages in thread From: Berry, Charles via General discussions about Org-mode. @ 2020-08-29 20:35 UTC (permalink / raw) To: Jack Kamm; +Cc: emacs-orgmode@gnu.org, Dylan Schwilk This problem has been bugging people for years and previous attempts to solve it have always run up against creating more problems in the process of solving this one. This workaround gives the same results with or without `:session "NEW"' and same as OPs first src block: #+header: :prologue "capture.output({" :epilogue "})" #+begin_src R :results value verbatim :session "NEW" print("<X> <Y> <!>") print("one <two> three") print("end") #+end_src If you do decide to dig into solving this, please be sure that remote sessions and graphical outputs are not broken. test-ob-R.el does not cover those cases. In fact, it is pretty short, so there are probably other things that could break without `make test' complaining. HTH, Chuck > On Aug 29, 2020, at 12:24 AM, Jack Kamm <jackkamm@gmail.com> wrote: > > Hi Dylan, > >> The patch does fix that issue -- but it introduces a different bug >> for code blocks with ~:session~: the R block now only produces >> output from the last statement evaluated. > > Of course, you're right. Good catch. > > Here's another attempt. It fixes the issue by modifying the R comint > regular expression, requiring it to match at the beginning of the line. ^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Help debugging R source code block output problem with :session 2020-08-29 20:35 ` Berry, Charles via General discussions about Org-mode. @ 2020-08-30 4:37 ` Dylan Schwilk 2020-08-30 15:08 ` Jack Kamm 2020-09-07 8:18 ` Jack Kamm 2 siblings, 0 replies; 25+ messages in thread From: Dylan Schwilk @ 2020-08-30 4:37 UTC (permalink / raw) To: Berry, Charles; +Cc: Jack Kamm, emacs-orgmode@gnu.org Thanks for the workaround idea of grabbing the results as a string. I'm not sure why this issue cropped up for me right now when I did not run into it in previous years. But I have run into other :results output issues in the past when ess changed. Thanks, Dylan On Sat 29 Aug 2020 at 15:35, Berry, Charles <ccberry@health.ucsd.edu> wrote: > This problem has been bugging people for years and previous > attempts to solve it have always run up against creating more > problems in the process of solving this one. > > This workaround gives the same results with or without `:session > "NEW"' and same as OPs first src block: > > #+header: :prologue "capture.output({" :epilogue "})" > #+begin_src R :results value verbatim :session "NEW" > print("<X> <Y> <!>") > print("one <two> three") > print("end") > #+end_src > > If you do decide to dig into solving this, please be sure that > remote sessions and graphical outputs are not broken. > test-ob-R.el does not cover those cases. In fact, it is pretty > short, so there are probably other things that could break > without `make test' complaining. > > HTH, > > Chuck > > >> On Aug 29, 2020, at 12:24 AM, Jack Kamm <jackkamm@gmail.com> >> wrote: >> >> Hi Dylan, >> >>> The patch does fix that issue -- but it introduces a different >>> bug >>> for code blocks with ~:session~: the R block now only produces >>> output from the last statement evaluated. >> >> Of course, you're right. Good catch. >> >> Here's another attempt. It fixes the issue by modifying the R >> comint >> regular expression, requiring it to match at the beginning of >> the line. -- ^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Help debugging R source code block output problem with :session 2020-08-29 20:35 ` Berry, Charles via General discussions about Org-mode. 2020-08-30 4:37 ` Dylan Schwilk @ 2020-08-30 15:08 ` Jack Kamm 2020-09-07 8:18 ` Jack Kamm 2 siblings, 0 replies; 25+ messages in thread From: Jack Kamm @ 2020-08-30 15:08 UTC (permalink / raw) To: Berry, Charles; +Cc: emacs-orgmode@gnu.org, Dylan Schwilk Hi Chuck, "Berry, Charles" <ccberry@health.ucsd.edu> writes: > This problem has been bugging people for years and previous attempts to solve it have always run up against creating more problems in the process of solving this one. > > If you do decide to dig into solving this, please be sure that remote sessions and graphical outputs are not broken. test-ob-R.el does not cover those cases. In fact, it is pretty short, so there are probably other things that could break without `make test' complaining. Thanks for this info, it's helpful. I do want to dig deeper into this, but probably won't have bandwidth in the near future. But I've captured your note for when I return to this. I'll be sure to test that any solution works with remote sessions and graphics. Best, Jack ^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Help debugging R source code block output problem with :session 2020-08-29 20:35 ` Berry, Charles via General discussions about Org-mode. 2020-08-30 4:37 ` Dylan Schwilk 2020-08-30 15:08 ` Jack Kamm @ 2020-09-07 8:18 ` Jack Kamm 2020-09-07 8:45 ` Jack Kamm 2 siblings, 1 reply; 25+ messages in thread From: Jack Kamm @ 2020-09-07 8:18 UTC (permalink / raw) To: Berry, Charles; +Cc: emacs-orgmode@gnu.org, Dylan Schwilk [-- Attachment #1: Type: text/plain, Size: 905 bytes --] Hi Chuck and Dylan, "Berry, Charles" <ccberry@health.ucsd.edu> writes: > This problem has been bugging people for years and previous attempts to solve it have always run up against creating more problems in the process of solving this one. > > If you do decide to dig into solving this, please be sure that remote sessions and graphical outputs are not broken. test-ob-R.el does not cover those cases. In fact, it is pretty short, so there are probably other things that could break without `make test' complaining. I think I have found a robust solution to this issue, which I've attached. The solution avoids parsing for prompts at all, thus it should be robust even for the case when the beginning of an output line looks like a prompt. I tested that the unit tests all pass, and that remote sessions and graphical outputs still work. I also added Dylan's examples as unit tests. Cheers, Jack [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: 0001-ob-R-Fix-session-output-with-substrings-matching-pro.patch --] [-- Type: text/x-patch, Size: 4277 bytes --] From 76d0eaa31506ce8a2f81f64eae43161db5721317 Mon Sep 17 00:00:00 2001 From: Jack Kamm <jackkamm@gmail.com> Date: Mon, 7 Sep 2020 00:41:52 -0700 Subject: [PATCH] ob-R: Fix session output with substrings matching prompts * lisp/ob-R.el (ess-send-string): Declare external function. (org-babel-R-evaluate-session): New implementation for session output results, that replaces calls to org-babel-comint-with-output with custom code. * testing/lisp/test-ob-R.el (test-ob-R/prompt-output): New test for output results containing angle brackets. (test-ob-R/output-nonprinted): New test for output results that aren't explicitly printed. Fixes issue reported in https://orgmode.org/list/875zgjh8wn.fsf@gmail.com/, https://orgmode.org/list/87r1rqled0.fsf@havana/ --- lisp/ob-R.el | 37 +++++++++++++++++++------------------ testing/lisp/test-ob-R.el | 13 +++++++++++++ 2 files changed, 32 insertions(+), 18 deletions(-) diff --git a/lisp/ob-R.el b/lisp/ob-R.el index 5e9d35f58..b37e3965a 100644 --- a/lisp/ob-R.el +++ b/lisp/ob-R.el @@ -38,6 +38,8 @@ (declare-function ess-make-buffer-current "ext:ess-inf" ()) (declare-function ess-eval-buffer "ext:ess-inf" (vis)) (declare-function ess-wait-for-process "ext:ess-inf" (&optional proc sec-prompt wait force-redisplay)) +(declare-function ess-send-string "ext:ess-inf" + (process string &optional visibly message _type)) (defconst org-babel-header-args:R '((width . :any) @@ -437,24 +439,23 @@ (defun org-babel-R-evaluate-session (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 - "^\\([>+.]\\([ ][>.+]\\)*[ ]\\)" - (car (split-string line "\n"))) - (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* ((tmp-file (org-babel-temp-file "R-"))) + (with-temp-file tmp-file + (insert (concat body "\n" org-babel-R-eoe-indicator))) + (with-current-buffer session + (let* ((process (get-buffer-process (current-buffer))) + (string-buffer "") + (comint-output-filter-functions + (cons (lambda (text) (setq string-buffer + (concat string-buffer text))) + comint-output-filter-functions))) + (ess-send-string + process (format "source('%s', print.eval=TRUE)" + (org-babel-process-file-name tmp-file 'noquote))) + (while (not (string-match (regexp-quote org-babel-R-eoe-output) + string-buffer)) + (accept-process-output process)) + (substring string-buffer 0 (match-beginning 0)))))))) (defun org-babel-R-process-value-result (result column-names-p) "R-specific processing of return value. diff --git a/testing/lisp/test-ob-R.el b/testing/lisp/test-ob-R.el index 7ce340ba4..ff7ea19d5 100644 --- a/testing/lisp/test-ob-R.el +++ b/testing/lisp/test-ob-R.el @@ -97,6 +97,19 @@ (ert-deftest test-ob-R/results-file () (org-babel-goto-named-result "TESTSRC") (forward-line 1) (should (string= "[[file:junk/test.org]]" (buffer-substring-no-properties (point-at-bol) (point-at-eol))))))) + +(ert-deftest test-ob-R/prompt-output () + (let (ess-ask-for-ess-directory ess-history-file) + (org-test-with-temp-text + "#+begin_src R :results output :session\nprint(\"<X> <Y> <!>\")\nprint(\"one <two> three\")\nprint(\"end\")\n#+end_src\n" + (should (string= "[1] \"<X> <Y> <!>\"\n[1] \"one <two> three\"\n[1] \"end\"\n" (org-babel-execute-src-block)))))) + +(ert-deftest test-ob-R/output-nonprinted () + (let (ess-ask-for-ess-directory ess-history-file) + (org-test-with-temp-text + "#+begin_src R :results output :session\n4.0 * 3.5\nlog(10)\nlog10(10)\n(3 + 1) * 5\n3^-1\n1/0\n#+end_src\n" + (should (string= "[1] 14\n[1] 2.302585\n[1] 1\n[1] 20\n[1] 0.3333333\n[1] Inf\n" (org-babel-execute-src-block)))))) + (provide 'test-ob-R) ;;; test-ob-R.el ends here -- 2.28.0 ^ permalink raw reply related [flat|nested] 25+ messages in thread
* Re: Help debugging R source code block output problem with :session 2020-09-07 8:18 ` Jack Kamm @ 2020-09-07 8:45 ` Jack Kamm 2020-09-07 17:37 ` Berry, Charles via General discussions about Org-mode. 0 siblings, 1 reply; 25+ messages in thread From: Jack Kamm @ 2020-09-07 8:45 UTC (permalink / raw) To: Berry, Charles; +Cc: emacs-orgmode@gnu.org, Dylan Schwilk [-- Attachment #1: Type: text/plain, Size: 190 bytes --] I just realized my patch had an issue where it freezes if there is an error in the source block. I'm attaching a second patch, to be applied on top of the first one, that fixes the issue. [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: fix-R-prompt-patch.patch --] [-- Type: text/x-patch, Size: 1044 bytes --] diff --git a/lisp/ob-R.el b/lisp/ob-R.el index b37e3965a..5ddf0ebd1 100644 --- a/lisp/ob-R.el +++ b/lisp/ob-R.el @@ -441,7 +441,7 @@ (defun org-babel-R-evaluate-session (output (let* ((tmp-file (org-babel-temp-file "R-"))) (with-temp-file tmp-file - (insert (concat body "\n" org-babel-R-eoe-indicator))) + (insert body)) (with-current-buffer session (let* ((process (get-buffer-process (current-buffer))) (string-buffer "") @@ -450,8 +450,9 @@ (defun org-babel-R-evaluate-session (concat string-buffer text))) comint-output-filter-functions))) (ess-send-string - process (format "source('%s', print.eval=TRUE)" - (org-babel-process-file-name tmp-file 'noquote))) + process (format "tryCatch(source('%s', print.eval=TRUE), finally=print(%s))" + (org-babel-process-file-name tmp-file 'noquote) + org-babel-R-eoe-indicator)) (while (not (string-match (regexp-quote org-babel-R-eoe-output) string-buffer)) (accept-process-output process)) ^ permalink raw reply related [flat|nested] 25+ messages in thread
* Re: Help debugging R source code block output problem with :session 2020-09-07 8:45 ` Jack Kamm @ 2020-09-07 17:37 ` Berry, Charles via General discussions about Org-mode. 2020-09-07 20:07 ` Jack Kamm 0 siblings, 1 reply; 25+ messages in thread From: Berry, Charles via General discussions about Org-mode. @ 2020-09-07 17:37 UTC (permalink / raw) To: Jack Kamm; +Cc: emacs-orgmode@gnu.org, Dylan Schwilk Jack, This does not work for my remote session. I run from macOS locally and on a Linux host remotely. I use M-x shell RET R RET M-x ess-remote RET R RET to start the R session. The problem is that tempfiles on the remote host are like "/tmp/RtmpeFHudh/file23a66d2fc1f9", but emacs tries to use '/var/folders/kb/2hchpbyj7lb6z76l0q73w_fh0000gn/T/babel-OSXKNd/R-oNOVVB' `org-babel-temp-file' doesn't honor remote connections AFAICS. Maybe there is some comint or tramp idiom that would solve this, but I do not know what it is. Chuck > On Sep 7, 2020, at 1:45 AM, Jack Kamm <jackkamm@gmail.com> wrote: > > I just realized my patch had an issue where it freezes if there is an > error in the source block. > > I'm attaching a second patch, to be applied on top of the first one, that fixes the issue. > > diff --git a/lisp/ob-R.el b/lisp/ob-R.el > index b37e3965a..5ddf0ebd1 100644 > --- a/lisp/ob-R.el > +++ b/lisp/ob-R.el > @@ -441,7 +441,7 @@ (defun org-babel-R-evaluate-session > (output > (let* ((tmp-file (org-babel-temp-file "R-"))) > (with-temp-file tmp-file > - (insert (concat body "\n" org-babel-R-eoe-indicator))) > + (insert body)) > (with-current-buffer session > (let* ((process (get-buffer-process (current-buffer))) > (string-buffer "") > @@ -450,8 +450,9 @@ (defun org-babel-R-evaluate-session > (concat string-buffer text))) > comint-output-filter-functions))) > (ess-send-string > - process (format "source('%s', print.eval=TRUE)" > - (org-babel-process-file-name tmp-file 'noquote))) > + process (format "tryCatch(source('%s', print.eval=TRUE), finally=print(%s))" > + (org-babel-process-file-name tmp-file 'noquote) > + org-babel-R-eoe-indicator)) > (while (not (string-match (regexp-quote org-babel-R-eoe-output) > string-buffer)) > (accept-process-output process)) ^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Help debugging R source code block output problem with :session 2020-09-07 17:37 ` Berry, Charles via General discussions about Org-mode. @ 2020-09-07 20:07 ` Jack Kamm 2020-09-07 22:12 ` Berry, Charles via General discussions about Org-mode. 2020-10-28 13:13 ` Jack Kamm 0 siblings, 2 replies; 25+ messages in thread From: Jack Kamm @ 2020-09-07 20:07 UTC (permalink / raw) To: Berry, Charles; +Cc: emacs-orgmode@gnu.org, Dylan Schwilk [-- Attachment #1: Type: text/plain, Size: 2282 bytes --] Hi Chuck, > This does not work for my remote session. Thanks for testing this. The remote tests I originally tried did not cover this case -- I only tested the case where both org-file and session were remote, but didn't test the case where org-file was local and session was remote. I've now tested this case as well, and added some fixes for it. I'm reattaching the patch in full. However, this implementation does require the R session to have the correct default-directory -- see details below. > The problem is that tempfiles on the remote host are like "/tmp/RtmpeFHudh/file23a66d2fc1f9", but emacs tries to use '/var/folders/kb/2hchpbyj7lb6z76l0q73w_fh0000gn/T/babel-OSXKNd/R-oNOVVB' > > `org-babel-temp-file' doesn't honor remote connections AFAICS. org-babel-temp-file does honor remote connections, but relies on default-directory to do so. I've moved the call to org-babel-temp-file so it happens when the session buffer is current -- that way, the tempfile will be correctly handled, assuming that the session's default-directory is on the remote location. If the session's default-directory isn't at the remote location, then this will break. But, in this case some other things break as well, for example inserting links to remote plots. > Maybe there is some comint or tramp idiom that would solve this, but I do not know what it is. Here are some ways to start a remote R session with correct default-directory: 1. Do "M-x R", then when it prompts for a directory, use "/scp:hostname:/some/path". Optionally, first visit that location with "C-x C-f /scp:hostname:/some/path", so that the default value is already there. 2. Alternatively, start the R session by evaluating a source block with header argument ":dir /scp:hostname:/some/path". 3. If you prefer to use "M-x shell" with "ess-remote", first visit the remote location with "C-x C-f /scp:hostname:/some/path", before calling "M-x shell". 4. If you prefer to start "M-x shell" locally and then ssh in, it's still possible to have default-directory set, but it requires some configuration [1]. Or you could use "M-x cd" to set it as well. [1] https://emacs.stackexchange.com/questions/5589/automatically-update-default-directory-when-pwd-changes-in-shell-mode-and-term-m/5592#5592 Best, Jack [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: 0001-ob-R-Fix-session-output-with-substrings-matching-pro.patch --] [-- Type: text/x-patch, Size: 4289 bytes --] From e7f1a59167de88fb9a5b96a0e1ac3199f105f600 Mon Sep 17 00:00:00 2001 From: Jack Kamm <jackkamm@gmail.com> Date: Mon, 7 Sep 2020 00:41:52 -0700 Subject: [PATCH] ob-R: Fix session output with substrings matching prompts * lisp/ob-R.el (ess-send-string): Declare external function. (org-babel-R-evaluate-session): New implementation for session output results, that replaces calls to org-babel-comint-with-output with custom code. * testing/lisp/test-ob-R.el (test-ob-R/prompt-output): New test for output results containing angle brackets. (test-ob-R/output-nonprinted): New test for output results that aren't explicitly printed. Fixes issue reported in https://orgmode.org/list/875zgjh8wn.fsf@gmail.com/, https://orgmode.org/list/87r1rqled0.fsf@havana/ --- lisp/ob-R.el | 38 ++++++++++++++++++++------------------ testing/lisp/test-ob-R.el | 13 +++++++++++++ 2 files changed, 33 insertions(+), 18 deletions(-) diff --git a/lisp/ob-R.el b/lisp/ob-R.el index 5e9d35f58..dffbbe112 100644 --- a/lisp/ob-R.el +++ b/lisp/ob-R.el @@ -38,6 +38,8 @@ (declare-function ess-make-buffer-current "ext:ess-inf" ()) (declare-function ess-eval-buffer "ext:ess-inf" (vis)) (declare-function ess-wait-for-process "ext:ess-inf" (&optional proc sec-prompt wait force-redisplay)) +(declare-function ess-send-string "ext:ess-inf" + (process string &optional visibly message _type)) (defconst org-babel-header-args:R '((width . :any) @@ -437,24 +439,24 @@ (defun org-babel-R-evaluate-session (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 - "^\\([>+.]\\([ ][>.+]\\)*[ ]\\)" - (car (split-string line "\n"))) - (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")))) + (with-current-buffer session + (let* ((tmp-file (org-babel-temp-file "R-")) + (process (get-buffer-process (current-buffer))) + (string-buffer "") + (comint-output-filter-functions + (cons (lambda (text) (setq string-buffer + (concat string-buffer text))) + comint-output-filter-functions))) + (with-temp-file tmp-file + (insert body)) + (ess-send-string + process (format "tryCatch(source('%s', print.eval=TRUE), finally=print(%s))" + (org-babel-process-file-name tmp-file 'noquote) + org-babel-R-eoe-indicator)) + (while (not (string-match (regexp-quote org-babel-R-eoe-output) + string-buffer)) + (accept-process-output process)) + (substring string-buffer 0 (match-beginning 0))))))) (defun org-babel-R-process-value-result (result column-names-p) "R-specific processing of return value. diff --git a/testing/lisp/test-ob-R.el b/testing/lisp/test-ob-R.el index 7ce340ba4..ff7ea19d5 100644 --- a/testing/lisp/test-ob-R.el +++ b/testing/lisp/test-ob-R.el @@ -97,6 +97,19 @@ (ert-deftest test-ob-R/results-file () (org-babel-goto-named-result "TESTSRC") (forward-line 1) (should (string= "[[file:junk/test.org]]" (buffer-substring-no-properties (point-at-bol) (point-at-eol))))))) + +(ert-deftest test-ob-R/prompt-output () + (let (ess-ask-for-ess-directory ess-history-file) + (org-test-with-temp-text + "#+begin_src R :results output :session\nprint(\"<X> <Y> <!>\")\nprint(\"one <two> three\")\nprint(\"end\")\n#+end_src\n" + (should (string= "[1] \"<X> <Y> <!>\"\n[1] \"one <two> three\"\n[1] \"end\"\n" (org-babel-execute-src-block)))))) + +(ert-deftest test-ob-R/output-nonprinted () + (let (ess-ask-for-ess-directory ess-history-file) + (org-test-with-temp-text + "#+begin_src R :results output :session\n4.0 * 3.5\nlog(10)\nlog10(10)\n(3 + 1) * 5\n3^-1\n1/0\n#+end_src\n" + (should (string= "[1] 14\n[1] 2.302585\n[1] 1\n[1] 20\n[1] 0.3333333\n[1] Inf\n" (org-babel-execute-src-block)))))) + (provide 'test-ob-R) ;;; test-ob-R.el ends here -- 2.28.0 ^ permalink raw reply related [flat|nested] 25+ messages in thread
* Re: Help debugging R source code block output problem with :session 2020-09-07 20:07 ` Jack Kamm @ 2020-09-07 22:12 ` Berry, Charles via General discussions about Org-mode. 2020-09-08 1:06 ` Jack Kamm 2020-10-28 13:13 ` Jack Kamm 1 sibling, 1 reply; 25+ messages in thread From: Berry, Charles via General discussions about Org-mode. @ 2020-09-07 22:12 UTC (permalink / raw) To: Jack Kamm; +Cc: emacs-orgmode@gnu.org, Dylan Schwilk Jack, I can confirm that this works on my setup in each of the scenarios in which `default-directory' got set correctly in the session buffer. At some point, my default-directory got reset to drop the tramp prefix "/scp:/user@host:" in one session after faithfully running the src block several times. I am unable to sort out why or even reproduce this. Chuck > On Sep 7, 2020, at 1:07 PM, Jack Kamm <jackkamm@gmail.com> wrote: > > Hi Chuck, > >> This does not work for my remote session. > > Thanks for testing this. > > The remote tests I originally tried did not cover this case -- I only > tested the case where both org-file and session were remote, but didn't > test the case where org-file was local and session was remote. > > I've now tested this case as well, and added some fixes for it. I'm > reattaching the patch in full. > > However, this implementation does require the R session to have the > correct default-directory -- see details below. ^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Help debugging R source code block output problem with :session 2020-09-07 22:12 ` Berry, Charles via General discussions about Org-mode. @ 2020-09-08 1:06 ` Jack Kamm 2020-09-08 2:08 ` Berry, Charles via General discussions about Org-mode. 0 siblings, 1 reply; 25+ messages in thread From: Jack Kamm @ 2020-09-08 1:06 UTC (permalink / raw) To: Berry, Charles; +Cc: emacs-orgmode@gnu.org, Dylan Schwilk Hi Chuck, > I can confirm that this works on my setup in each of the scenarios in which `default-directory' got set correctly in the session buffer. > > At some point, my default-directory got reset to drop the tramp prefix "/scp:/user@host:" in one session after faithfully running the src block several times. I am unable to sort out why or even reproduce this. Thanks for taking the time to test again. If you have any further feedback at any point, please don't hesitate. Best, Jack ^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Help debugging R source code block output problem with :session 2020-09-08 1:06 ` Jack Kamm @ 2020-09-08 2:08 ` Berry, Charles via General discussions about Org-mode. 2020-09-08 14:51 ` Jack Kamm 0 siblings, 1 reply; 25+ messages in thread From: Berry, Charles via General discussions about Org-mode. @ 2020-09-08 2:08 UTC (permalink / raw) To: Jack Kamm; +Cc: emacs-orgmode@gnu.org, Dylan Schwilk Jack, > On Sep 7, 2020, at 6:06 PM, Jack Kamm <jackkamm@gmail.com> wrote: > > Hi Chuck, > >> I can confirm that this works on my setup in each of the scenarios in which `default-directory' got set correctly in the session buffer. >> >> At some point, my default-directory got reset to drop the tramp prefix "/scp:/user@host:" in one session after faithfully running the src block several times. I am unable to sort out why or even reproduce this. > > Thanks for taking the time to test again. If you have any further > feedback at any point, please don't hesitate. > Thanks. This seems like it will help me. Also, I wonder if the `:results value' case can be handled in a similar manner, viz. - (let ((tmp-file (org-babel-temp-file "R-"))) + (let ((tmp-file (with-current-buffer session (org-babel-temp-file "R-")))) Best, Chuck ^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Help debugging R source code block output problem with :session 2020-09-08 2:08 ` Berry, Charles via General discussions about Org-mode. @ 2020-09-08 14:51 ` Jack Kamm 2020-09-08 16:45 ` Berry, Charles via General discussions about Org-mode. 0 siblings, 1 reply; 25+ messages in thread From: Jack Kamm @ 2020-09-08 14:51 UTC (permalink / raw) To: Berry, Charles; +Cc: emacs-orgmode@gnu.org, Dylan Schwilk "Berry, Charles" <ccberry@health.ucsd.edu> writes: > Also, I wonder if the `:results value' case can be handled in a similar manner, viz. > > - (let ((tmp-file (org-babel-temp-file "R-"))) > + (let ((tmp-file (with-current-buffer session (org-babel-temp-file "R-")))) Yes, if we did that then tmp-file would have a prefix like "/scp:user@hostname:", and elisp would then know to read the result file from the remote host. Before pasting tmp-file into R code, we should also call (org-babel-process-file-name tmp-file 'noquote) to remove the tramp prefix when referring to the file from R. ^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Help debugging R source code block output problem with :session 2020-09-08 14:51 ` Jack Kamm @ 2020-09-08 16:45 ` Berry, Charles via General discussions about Org-mode. 2020-09-08 17:41 ` Jack Kamm 0 siblings, 1 reply; 25+ messages in thread From: Berry, Charles via General discussions about Org-mode. @ 2020-09-08 16:45 UTC (permalink / raw) To: Jack Kamm; +Cc: emacs-orgmode@gnu.org, Dylan Schwilk Jack, Maybe I am confused here: > On Sep 8, 2020, at 7:51 AM, Jack Kamm <jackkamm@gmail.com> wrote: > > Yes, if we did that then tmp-file would have a prefix like > "/scp:user@hostname:", and elisp would then know to read the result file > from the remote host. > > Before pasting tmp-file into R code, we should also call > > (org-babel-process-file-name tmp-file 'noquote) > > to remove the tramp prefix when referring to the file from R. this is already present in `org-babel-R-evaluate-session' in the call to `org-babel-comint-eval-invisibly-and-wait-for-file'' just a couple of lines further down in the `(cl-case result-type (value ...))' branch. The other use of `tmp-file' in that block is the one that requires the prefix, right? So nothing more to fix. ?? Chuck ^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Help debugging R source code block output problem with :session 2020-09-08 16:45 ` Berry, Charles via General discussions about Org-mode. @ 2020-09-08 17:41 ` Jack Kamm 2020-09-18 16:39 ` Dylan Schwilk 0 siblings, 1 reply; 25+ messages in thread From: Jack Kamm @ 2020-09-08 17:41 UTC (permalink / raw) To: Berry, Charles; +Cc: emacs-orgmode@gnu.org, Dylan Schwilk Hi Chuck, > this is already present in `org-babel-R-evaluate-session' in the call to `org-babel-comint-eval-invisibly-and-wait-for-file'' just a couple of lines further down in the `(cl-case result-type (value ...))' branch. > > The other use of `tmp-file' in that block is the one that requires the prefix, right? > > So nothing more to fix. > > ?? You're right, I didn't notice that it's already present -- nothing more to fix. Jack ^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Help debugging R source code block output problem with :session 2020-09-08 17:41 ` Jack Kamm @ 2020-09-18 16:39 ` Dylan Schwilk 0 siblings, 0 replies; 25+ messages in thread From: Dylan Schwilk @ 2020-09-18 16:39 UTC (permalink / raw) To: Jack Kamm; +Cc: Berry, Charles, emacs-orgmode@gnu.org Thanks. This patch works for my org files. On Tue 08 Sep 2020 at 12:41, Jack Kamm <jackkamm@gmail.com> wrote: > Hi Chuck, > >> this is already present in `org-babel-R-evaluate-session' in >> the call to >> `org-babel-comint-eval-invisibly-and-wait-for-file'' just a >> couple of lines further down in the `(cl-case result-type >> (value ...))' branch. >> >> The other use of `tmp-file' in that block is the one that >> requires the prefix, right? >> >> So nothing more to fix. >> >> ?? > > You're right, I didn't notice that it's already present -- > nothing more > to fix. > > Jack -- ^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Help debugging R source code block output problem with :session 2020-09-07 20:07 ` Jack Kamm 2020-09-07 22:12 ` Berry, Charles via General discussions about Org-mode. @ 2020-10-28 13:13 ` Jack Kamm 2020-10-28 13:46 ` Jeremie Juste 1 sibling, 1 reply; 25+ messages in thread From: Jack Kamm @ 2020-10-28 13:13 UTC (permalink / raw) To: jeremiejuste, Berry, Charles; +Cc: emacs-orgmode@gnu.org, Dylan Schwilk Hi Jeremie, Thanks for volunteering to maintain ob-R.el :) I'm bumping this patch [0] to see if it could be merged into ob-R.el. It fixes some long-standing issues with prompt mangling for :session blocks with :results output. Elsewhere in the thread, Chuck had a suggestion [1] to allow :results value to be properly handled in remote sessions. It's not included in the patch, but worth adding separately IMO. It may be helpful reading the thread in full -- Chuck had several comments on ob-R that I found insightful, and may be useful for you to consider as maintainer. I'd highlight [2] in particular: > If you do decide to dig into solving this, please be sure that remote > sessions and graphical outputs are not broken. test-ob-R.el does not > cover those cases. In fact, it is pretty short, so there are probably > other things that could break without `make test' complaining. All the best, Jack [0] https://orgmode.org/list/87ft7t9wqk.fsf@gmail.com/ [1] https://orgmode.org/list/1E0046A6-1FAB-45B5-9B08-68FE1BE98180@health.ucsd.edu/ [2] https://orgmode.org/list/352C7149-743F-4944-ACA5-7A1242B5A3AA@health.ucsd.edu/ ^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Help debugging R source code block output problem with :session 2020-10-28 13:13 ` Jack Kamm @ 2020-10-28 13:46 ` Jeremie Juste 0 siblings, 0 replies; 25+ messages in thread From: Jeremie Juste @ 2020-10-28 13:46 UTC (permalink / raw) To: Jack Kamm; +Cc: Berry, Charles, emacs-orgmode@gnu.org, Dylan Schwilk Hello Jack, > Thanks for volunteering to maintain ob-R.el :) Thanks for the encouragements and the suggestions. I need will take some time to dive into the existing code but I will definitely look into it and keep you posted. I've also noticed a [1] bug waiting to be fixed. [1] https://orgmode.org/list/71761E05-7D0A-4FEF-8BAF-4C776A2FC17E@health.ucsd.edu/ Best regards, Jeremie On Wednesday, 28 Oct 2020 at 06:13, Jack Kamm wrote: > Hi Jeremie, > > Thanks for volunteering to maintain ob-R.el :) > > I'm bumping this patch [0] to see if it could be merged into ob-R.el. It > fixes some long-standing issues with prompt mangling for :session blocks > with :results output. > > Elsewhere in the thread, Chuck had a suggestion [1] to allow :results > value to be properly handled in remote sessions. It's not included in > the patch, but worth adding separately IMO. > > It may be helpful reading the thread in full -- Chuck had several > comments on ob-R that I found insightful, and may be useful for you to > consider as maintainer. I'd highlight [2] in particular: > >> If you do decide to dig into solving this, please be sure that remote >> sessions and graphical outputs are not broken. test-ob-R.el does not >> cover those cases. In fact, it is pretty short, so there are probably >> other things that could break without `make test' complaining. > > All the best, > Jack > > [0] https://orgmode.org/list/87ft7t9wqk.fsf@gmail.com/ > [1] https://orgmode.org/list/1E0046A6-1FAB-45B5-9B08-68FE1BE98180@health.ucsd.edu/ > [2] https://orgmode.org/list/352C7149-743F-4944-ACA5-7A1242B5A3AA@health.ucsd.edu/ > ^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Help debugging R source code block output problem with :session 2020-08-29 7:24 ` Jack Kamm 2020-08-29 20:35 ` Berry, Charles via General discussions about Org-mode. @ 2020-08-30 4:18 ` Dylan Schwilk 2021-05-03 8:53 ` Jeremie Juste 2 siblings, 0 replies; 25+ messages in thread From: Dylan Schwilk @ 2020-08-30 4:18 UTC (permalink / raw) To: Jack Kamm; +Cc: emacs-orgmode Yes, the modified comint-prompt-regexp works for my use cases and I'm back to expected output and what I had last time I taught the course. This was my instinct for a simple solution as well, but I've not tested against remote sessions and graphical outputs as Charles Berry warns. I'll take a look at your ob-session-async, thanks! -Dylan On Sat 29 Aug 2020 at 02:24, Jack Kamm <jackkamm@gmail.com> wrote: > Hi Dylan, > >> The patch does fix that issue -- but it introduces a different >> bug >> for code blocks with ~:session~: the R block now only produces >> output from the last statement evaluated. > > Of course, you're right. Good catch. > > Here's another attempt. It fixes the issue by modifying the R > comint > regular expression, requiring it to match at the beginning of > the line. > > I think this should fix most cases, including the examples you > sent. Still, it's not totally robust -- for example, it will > still > mangle multiline strings, if one of the lines starts with a > substring > that looks like a prompt. > > I'd be interested to hear if the attached patch works for the > common > cases you encounter, such as with tibbles. > > As an aside, I personally use an alternative implementation of > ob-R > sessions that doesn't suffer from this issue, and also provides > some > other benefits like async evaluation [1]. I'm planning to submit > these > changes to org-mode someday, but am not ready yet. But you may > want to > check it out, it was able to solve the issue in the other thread > I > linked as well. > > [1] https://github.com/jackkamm/ob-session-async > > From 9eaf81d708f88d06f14f9b6b9cf4182dd0fbb997 Mon Sep 17 > 00:00:00 2001 > From: Jack Kamm <jackkamm@gmail.com> > Date: Sat, 29 Aug 2020 00:07:58 -0700 > Subject: [PATCH] ob-R: Fix prompt mangling in session output > > * lisp/ob-R.el (org-babel-R-evaluate-session): Force comint > prompt > regexp to start at beginning of line, to prevent > org-babel-comint-with-output from splitting mid-line. > > Fixes https://orgmode.org/list/875zgjh8wn.fsf@gmail.com/ and > https://orgmode.org/list/87r1rqled0.fsf@havana/ > --- > lisp/ob-R.el | 12 +++++++----- > 1 file changed, 7 insertions(+), 5 deletions(-) > > diff --git a/lisp/ob-R.el b/lisp/ob-R.el > index 5e9d35f58..10b3b6fe3 100644 > --- a/lisp/ob-R.el > +++ b/lisp/ob-R.el > @@ -450,11 +450,13 @@ (defun org-babel-R-evaluate-session > (car (split-string line "\n"))) > (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")))) > + (with-current-buffer session > + (let ((comint-prompt-regexp (concat "^" > comint-prompt-regexp))) > + (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")))) > > (defun org-babel-R-process-value-result (result column-names-p) > "R-specific processing of return value. -- ^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Help debugging R source code block output problem with :session 2020-08-29 7:24 ` Jack Kamm 2020-08-29 20:35 ` Berry, Charles via General discussions about Org-mode. 2020-08-30 4:18 ` Dylan Schwilk @ 2021-05-03 8:53 ` Jeremie Juste 2 siblings, 0 replies; 25+ messages in thread From: Jeremie Juste @ 2021-05-03 8:53 UTC (permalink / raw) To: Jack Kamm; +Cc: Berry, Charles, emacs-orgmode, Ilja Kocken, Dylan Schwilk Hello, I must apologize again for the delay. I'll be more responsive from now on. @Jack, I have applied the patch at the bottom of the mail. It is not your latest patch but it works as well and is able to handle R errors. > https://orgmode.org/list/87ft7t9wqk.fsf@gmail.com/ I have also added the 2 test cases with to make sure we are aware if this feature breaks in the future. > https://orgmode.org/list/87h7slgbi5.fsf@gmail.com/ > I'd be interested to hear if the attached patch works for the common > cases you encounter, such as with tibbles. @ Ilja, sorry for the delayed reply. Regarding tibbles we are still not out of the woods. But the current patch would work if crayon option is removed. #+BEGIN_SRC R :results output :session "local1" :pre options(crayon.enabled=FALSE) library(tidyr) library(dplyr) as_tibble(iris) #+END_SRC #+RESULTS: #+begin_example # A tibble: 150 x 5 Sepal.Length Sepal.Width Petal.Length Petal.Width Species <dbl> <dbl> <dbl> <dbl> <fct> 1 5.1 3.5 1.4 0.2 setosa 2 4.9 3 1.4 0.2 setosa 3 4.7 3.2 1.3 0.2 setosa 4 4.6 3.1 1.5 0.2 setosa 5 5 3.6 1.4 0.2 setosa 6 5.4 3.9 1.7 0.4 setosa 7 4.6 3.4 1.4 0.3 setosa 8 5 3.4 1.5 0.2 setosa 9 4.4 2.9 1.4 0.2 setosa 10 4.9 3.1 1.5 0.1 setosa # … with 140 more rows #+end_example > @Chuck > https://orgmode.org/list/352C7149-743F-4944-ACA5-7A1242B5A3AA@health.ucsd.edu/ >If you do decide to dig into solving this, please be sure that remote >sessions and graphical outputs are not broken. test-ob-R.el does not >cover those cases. In fact, it is pretty short, so there are probably >other things that could break without `make test' complaining. The current patch have been tested for remote connections as well and AFAIK, nothing breaks. But I'm afraid that the graphical output is broken and has long been even before the path. The test for graphical output is compromised and does not do the right test. I will suggest new ones. Please feel free to contact me or reply on the mailing list if you have see any improvements to be made. Best regards, Jeremie On Saturday, 29 Aug 2020 at 00:24, Jack Kamm wrote: >>From 9eaf81d708f88d06f14f9b6b9cf4182dd0fbb997 Mon Sep 17 00:00:00 2001 > From: Jack Kamm <jackkamm@gmail.com> > Date: Sat, 29 Aug 2020 00:07:58 -0700 > Subject: [PATCH] ob-R: Fix prompt mangling in session output > > * lisp/ob-R.el (org-babel-R-evaluate-session): Force comint prompt > regexp to start at beginning of line, to prevent > org-babel-comint-with-output from splitting mid-line. > > Fixes https://orgmode.org/list/875zgjh8wn.fsf@gmail.com/ and > https://orgmode.org/list/87r1rqled0.fsf@havana/ > --- > lisp/ob-R.el | 12 +++++++----- > 1 file changed, 7 insertions(+), 5 deletions(-) > > diff --git a/lisp/ob-R.el b/lisp/ob-R.el > index 5e9d35f58..10b3b6fe3 100644 > --- a/lisp/ob-R.el > +++ b/lisp/ob-R.el > @@ -450,11 +450,13 @@ (defun org-babel-R-evaluate-session > (car (split-string line "\n"))) > (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")))) > + (with-current-buffer session > + (let ((comint-prompt-regexp (concat "^" comint-prompt-regexp))) > + (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")))) > > (defun org-babel-R-process-value-result (result column-names-p) > "R-specific processing of return value. > -- > 2.28.0 ^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Help debugging R source code block output problem with :session @ 2022-01-11 23:36 John Hendy 2022-01-12 7:49 ` Jeremie Juste 0 siblings, 1 reply; 25+ messages in thread From: John Hendy @ 2022-01-11 23:36 UTC (permalink / raw) To: Jack Kamm, Jeremie Juste, Berry, Charles, emacs-orgmode, Ilja Kocken, Dylan Schwilk Greetings, Apologies for writing off-list, but I don't have the original thread anymore to reply to. I just pulled this group in directly from the email I found... I just got bitten by this as well and burned most of my afternoon trying to figure out what the issue was. Any further thoughts on a patch that could be finalized/applied? Is the one from the thread still the best from your continued experience? https://list.orgmode.org/87zgxc42qg.fsf@gmail.com/ This r/orgmode post was what finally got me to the existence of this as a previous issue (I'd just sent my own email to list as my searching did not find the above): https://www.reddit.com/r/orgmode/comments/pt3em4/source_block_modifying_format_of_results_r/ And it links to a patch as well: https://gist.github.com/gtuckerkellogg/e356d20497cfdc8e4fc683412e320e3e Many thanks, John ^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Help debugging R source code block output problem with :session 2022-01-11 23:36 John Hendy @ 2022-01-12 7:49 ` Jeremie Juste 2022-01-12 15:04 ` John Hendy 0 siblings, 1 reply; 25+ messages in thread From: Jeremie Juste @ 2022-01-12 7:49 UTC (permalink / raw) To: John Hendy Cc: Jack Kamm, emacs-orgmode, Berry, Charles, Ilja Kocken, Dylan Schwilk Hello John, Many thanks for reporting. I'm short of time right now, but I'll take a closer look at the problem over the weekend and keep you posted. Could you let me know which version of org-mode you are currently using? Best regards, Jeremie Juste On Tuesday, 11 Jan 2022 at 17:36, John Hendy wrote: > Greetings, > > Apologies for writing off-list, but I don't have the original thread > anymore to reply to. I just pulled this group in directly from the > email I found... I just got bitten by this as well and burned most of > my afternoon trying to figure out what the issue was. > > Any further thoughts on a patch that could be finalized/applied? > > Is the one from the thread still the best from your continued experience? > https://list.orgmode.org/87zgxc42qg.fsf@gmail.com/ > > This r/orgmode post was what finally got me to the existence of this > as a previous issue (I'd just sent my own email to list as my > searching did not find the above): > https://www.reddit.com/r/orgmode/comments/pt3em4/source_block_modifying_format_of_results_r/ > > And it links to a patch as well: > https://gist.github.com/gtuckerkellogg/e356d20497cfdc8e4fc683412e320e3e > > Many thanks, > John ^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Help debugging R source code block output problem with :session 2022-01-12 7:49 ` Jeremie Juste @ 2022-01-12 15:04 ` John Hendy 0 siblings, 0 replies; 25+ messages in thread From: John Hendy @ 2022-01-12 15:04 UTC (permalink / raw) To: Jeremie Juste Cc: Jack Kamm, emacs-orgmode, Berry, Charles, Ilja Kocken, Dylan Schwilk [-- Attachment #1: Type: text/plain, Size: 2390 bytes --] On Wed, Jan 12, 2022 at 1:50 AM Jeremie Juste <jeremiejuste@gmail.com> wrote: > > Hello John, > > Many thanks for reporting. I'm short of time right now, but I'll take a closer look at the problem over > the weekend and keep you posted. Could you let me know which version of > org-mode you are currently using? Sure thing and thanks for the quick note! I use org from git and *thought* it used to report the most recent release tag, but I see: $ git log commit 7fa8173282f85c2ca03cc7f51f28f6adfb250610 (HEAD -> master, origin/master, origin/HEAD) Author: Ian Martins <ianxm@jhu.edu> Date: Sat Jan 16 15:52:21 2021 -0500 But Mx-version: Org mode version 9.4.4 (release_9.4.4-186-g7fa817.dirty @ /home/jwhendy/.elisp/org/lisp/) So perhaps it appends the git commit to the system version? Btw, it's dirty as I was able to apply Jack's patches (with some mods) successfully and am a happy camper. In case it's helpful, I attached the patches as I applied them (first -1, then -2) to this org-version. Nothing special, they are just Jack's patches with a couple sections removed (one change was already present, and I removed the adjustments to the testing file as they were failing). Thanks so much to all of you who contributed to that, as I'm so happy that I can at least continue on with my report at this point with good looking output! Many thanks, John > > Best regards, > Jeremie Juste > > > On Tuesday, 11 Jan 2022 at 17:36, John Hendy wrote: > > Greetings, > > > > Apologies for writing off-list, but I don't have the original thread > > anymore to reply to. I just pulled this group in directly from the > > email I found... I just got bitten by this as well and burned most of > > my afternoon trying to figure out what the issue was. > > > > Any further thoughts on a patch that could be finalized/applied? > > > > Is the one from the thread still the best from your continued experience? > > https://list.orgmode.org/87zgxc42qg.fsf@gmail.com/ > > > > This r/orgmode post was what finally got me to the existence of this > > as a previous issue (I'd just sent my own email to list as my > > searching did not find the above): > > https://www.reddit.com/r/orgmode/comments/pt3em4/source_block_modifying_format_of_results_r/ > > > > And it links to a patch as well: > > https://gist.github.com/gtuckerkellogg/e356d20497cfdc8e4fc683412e320e3e > > > > Many thanks, > > John [-- Attachment #2: ob-R-1.patch --] [-- Type: text/x-patch, Size: 1724 bytes --] diff --git a/lisp/ob-R.el b/lisp/ob-R.el index 5e9d35f58..b37e3965a 100644 --- a/lisp/ob-R.el +++ b/lisp/ob-R.el @@ -437,24 +439,23 @@ (defun org-babel-R-evaluate-session (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 - "^\\([>+.]\\([ ][>.+]\\)*[ ]\\)" - (car (split-string line "\n"))) - (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* ((tmp-file (org-babel-temp-file "R-"))) + (with-temp-file tmp-file + (insert (concat body "\n" org-babel-R-eoe-indicator))) + (with-current-buffer session + (let* ((process (get-buffer-process (current-buffer))) + (string-buffer "") + (comint-output-filter-functions + (cons (lambda (text) (setq string-buffer + (concat string-buffer text))) + comint-output-filter-functions))) + (ess-send-string + process (format "source('%s', print.eval=TRUE)" + (org-babel-process-file-name tmp-file 'noquote))) + (while (not (string-match (regexp-quote org-babel-R-eoe-output) + string-buffer)) + (accept-process-output process)) + (substring string-buffer 0 (match-beginning 0)))))))) (defun org-babel-R-process-value-result (result column-names-p) "R-specific processing of return value. [-- Attachment #3: ob-R-2.patch --] [-- Type: text/x-patch, Size: 1044 bytes --] diff --git a/lisp/ob-R.el b/lisp/ob-R.el index b37e3965a..5ddf0ebd1 100644 --- a/lisp/ob-R.el +++ b/lisp/ob-R.el @@ -441,7 +441,7 @@ (defun org-babel-R-evaluate-session (output (let* ((tmp-file (org-babel-temp-file "R-"))) (with-temp-file tmp-file - (insert (concat body "\n" org-babel-R-eoe-indicator))) + (insert body)) (with-current-buffer session (let* ((process (get-buffer-process (current-buffer))) (string-buffer "") @@ -450,8 +450,9 @@ (defun org-babel-R-evaluate-session (concat string-buffer text))) comint-output-filter-functions))) (ess-send-string - process (format "source('%s', print.eval=TRUE)" - (org-babel-process-file-name tmp-file 'noquote))) + process (format "tryCatch(source('%s', print.eval=TRUE), finally=print(%s))" + (org-babel-process-file-name tmp-file 'noquote) + org-babel-R-eoe-indicator)) (while (not (string-match (regexp-quote org-babel-R-eoe-output) string-buffer)) (accept-process-output process)) ^ permalink raw reply related [flat|nested] 25+ messages in thread
end of thread, other threads:[~2022-01-12 15:40 UTC | newest] Thread overview: 25+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2020-08-28 20:11 Help debugging R source code block output problem with :session Dylan Schwilk 2020-08-29 2:36 ` Jack Kamm 2020-08-29 4:07 ` Dylan Schwilk 2020-08-29 7:24 ` Jack Kamm 2020-08-29 20:35 ` Berry, Charles via General discussions about Org-mode. 2020-08-30 4:37 ` Dylan Schwilk 2020-08-30 15:08 ` Jack Kamm 2020-09-07 8:18 ` Jack Kamm 2020-09-07 8:45 ` Jack Kamm 2020-09-07 17:37 ` Berry, Charles via General discussions about Org-mode. 2020-09-07 20:07 ` Jack Kamm 2020-09-07 22:12 ` Berry, Charles via General discussions about Org-mode. 2020-09-08 1:06 ` Jack Kamm 2020-09-08 2:08 ` Berry, Charles via General discussions about Org-mode. 2020-09-08 14:51 ` Jack Kamm 2020-09-08 16:45 ` Berry, Charles via General discussions about Org-mode. 2020-09-08 17:41 ` Jack Kamm 2020-09-18 16:39 ` Dylan Schwilk 2020-10-28 13:13 ` Jack Kamm 2020-10-28 13:46 ` Jeremie Juste 2020-08-30 4:18 ` Dylan Schwilk 2021-05-03 8:53 ` Jeremie Juste -- strict thread matches above, loose matches on Subject: below -- 2022-01-11 23:36 John Hendy 2022-01-12 7:49 ` Jeremie Juste 2022-01-12 15:04 ` John Hendy
Code repositories for project(s) associated with this public inbox https://git.savannah.gnu.org/cgit/emacs/org-mode.git This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).