emacs-orgmode
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [O] Multiple (identical) RESULTS blocks of one code block?


From: Rainer M Krug
Subject: Re: [O] Multiple (identical) RESULTS blocks of one code block?
Date: Tue, 10 Mar 2015 14:31:33 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.4 (darwin)

John Kitchin <address@hidden> writes:

> weird. I swear it worked in the little toy problem I made ;)
>
> I think this is a more robust function:
>
> #+BEGIN_SRC emacs-lisp
> (defun update-results ()
>   ;; get name of src block
>   (let* ((name (org-element-property :name (org-element-at-point)))
>         (results (save-excursion
>                    (goto-char (org-babel-find-named-result name))
>                    (forward-line)
>                    (buffer-substring
>                    (point) (org-element-property :end 
> (org-element-at-point)))))
>         (begin))
>     (save-excursion
>       (goto-char (point-min))
>       (while (setq begin (org-babel-find-named-result name (point)))
>         (goto-char begin)
>         (forward-line)
>         (setf (buffer-substring
>                (point)
>                (org-element-property :end (org-element-at-point)))
>               results)))))
> #+END_SRC
>
> I tested this one on two examples ;)

And also on my example...

Thanks John

Works perfectly - added to my emacs.org.

Any chance that you could put this into a patch so that it could go into org?

Rainer

>
> Rainer M Krug writes:
>
>> Rainer M Krug <address@hidden> writes:
>>
>>> John Kitchin <address@hidden> writes:
>>>
>>>> I don't believe this is possible out of the box. The first RESULTS block
>>>> from the beginning of the buffer will be updated, and not the others.
>>>>
>>>> You might be able to use a hook function to do this, something like:
>>>>
>>>> #+BEGIN_SRC emacs-lisp
>>>> (defun update-results () (interactive)
>>>>   ;; get name of src block
>>>>   (let ((name (org-element-property :name (org-element-at-point)))
>>>>         (results))
>>>>     (when name
>>>>       (org-element-map (org-element-parse-buffer) 'fixed-width
>>>>         (lambda (object)
>>>>           (if results
>>>>               ;; replace value in block
>>>>               (setf
>>>>                (buffer-substring
>>>>                 (org-element-property :begin  object)
>>>>                 (org-element-property :end  object))
>>>>                results)
>>>>             ;; set results
>>>>             (setq results
>>>>                   (buffer-substring
>>>>                    (org-element-property :begin  object)
>>>>                    (org-element-property :end  object)))))))))
>>>> #+END_SRC
>>>> #+BEGIN_SRC emacs-lisp
>>>> (add-hook 'org-babel-after-execute-hook 'update-results)
>>>> #+END_SRC
>>>>
>>>> This worked on a small test example, but I did not test it
>>>> thoroughly. your mileage might vary ;)
>>>
>>> This looks nice - I will try it out and see how it goes.
>>
>>
>> I don't get it to work.
>>
>> I put the following into my emacs.org and evaluated it:
>>
>> --8<---------------cut here---------------start------------->8---
>> (defun rmk/update-multiple-results-blocks () (interactive)
>>        ;; get name of src block
>>        (let ((name (org-element-property :name (org-element-at-point)))
>>              (results))
>>          (when name
>>            (org-element-map (org-element-parse-buffer) 'fixed-width
>>              (lambda (object)
>>                (if results
>>                    ;; replace value in block
>>                    (setf
>>                     (buffer-substring
>>                      (org-element-property :begin  object)
>>                      (org-element-property :end  object))
>>                     results)
>>                  ;; set results
>>                  (setq results
>>                        (buffer-substring
>>                         (org-element-property :begin  object)
>>                         (org-element-property :end  object)))))))))
>>
>> #+end_src
>>
>> #+RESULTS:
>> : rmk/update-multiple-results-blocks
>>
>> Add this function to =org-babel=after-execute-hook=
>> #+begin_src emacs-lisp
>> (add-hook 'org-babel-after-execute-hook 'rmk/update-multiple-results-blocks)
>> #+end_src
>>
>> #+RESULTS:
>> | rmk/update-multiple-results-blocks |
>> --8<---------------cut here---------------end--------------->8---
>>
>>
>> I am using the following org file to test it:
>>
>> --8<---------------cut here---------------start------------->8---
>> * The calculation
>> #+NAME: testcode
>> #+begin_src R :session test
>> runif(10)
>> #+end_src
>>
>> * summary of the results
>> First time
>> #+RESULTS: testcode
>> |  0.471471928292885 |
>> |  0.128247044514865 |
>> |  0.398714824113995 |
>> |  0.335577708436176 |
>> | 0.0184990330599248 |
>> |  0.952211205149069 |
>> |  0.367342215497047 |
>> |  0.581879974342883 |
>> |  0.440492485417053 |
>> | 0.0729096119757742 |
>>
>>
>> #+RESULTS: testcode
>> | 0.0095007149502635 |
>> | 0.0898537992034107 |
>> |  0.764667606214061 |
>> | 0.0309854068327695 |
>> |  0.510338442632928 |
>> |  0.220906731439754 |
>> |  0.589271233882755 |
>> |  0.966699115466326 |
>> | 0.0183747289702296 |
>> |  0.734954049577937 |
>> --8<---------------cut here---------------end--------------->8---
>>
>> But only the first results block is updated. The function
>> =rmk/update-multiple-results-blocks= is executed.
>>
>> I am using
>>
>> ,----
>> | Org-mode version 8.3beta (release_8.3beta-884-g9ed426 @ 
>> /Users/rainerkrug/.emacs.d/org-mode/lisp/)
>> | GNU Emacs 24.4.1 (x86_64-apple-darwin14.0.0, Carbon Version 157
>> | AppKit 1343.16) of 2015-02-02 on Rainers-MacBook-Pro-4.local
>> `----
>>
>> Any ideas what is going wrong?
>>
>> Thanks,
>>
>> Rainer
>>
>>
>>>
>>>
>>>>
>>>>
>>>> Rainer M Krug writes:
>>>>
>>>>> Hi
>>>>>
>>>>> Consider the following:
>>>>>
>>>>> --8<---------------cut here---------------start------------->8---
>>>>> * The calculation
>>>>> #+NAME: testcode :exports both
>>>>> #+begin_src R  :session test
>>>>> runif(10)
>>>>> #+end_src
>>>>>
>>>>>
>>>>> * summary of the results
>>>>> First time
>>>>> #+RESULTS: testcode :exports both
>>>>> |  0.772744940361008 |
>>>>> |  0.170518629485741 |
>>>>> | 0.0833237133920193 |
>>>>> |  0.149035625392571 |
>>>>> |  0.698798568220809 |
>>>>> |  0.627075897762552 |
>>>>> |  0.177144371205941 |
>>>>> | 0.0476319056469947 |
>>>>> |  0.289851602632552 |
>>>>> | 0.0296813279855996 |
>>>>>
>>>>> * and another
>>>>> testthingy
>>>>> #+RESULTS: testcode :exports both
>>>>>
>>>>> --8<---------------cut here---------------end--------------->8---
>>>>>
>>>>> If I update the calculation, the first results block is updated, but
>>>>> not the second one. I would like to have two RESULTS blocks which
>>>>> are both updated when the code block is evaluated.
>>>>>
>>>>> Is this possible?
>>>>>
>>>>> Thanks,
>>>>>
>>>>> Rainer
>>>>
>>>> --
>>>> Professor John Kitchin
>>>> Doherty Hall A207F
>>>> Department of Chemical Engineering
>>>> Carnegie Mellon University
>>>> Pittsburgh, PA 15213
>>>> 412-268-7803
>>>> @johnkitchin
>>>> http://kitchingroup.cheme.cmu.edu
>>>>
>>>>
>
> --
> Professor John Kitchin
> Doherty Hall A207F
> Department of Chemical Engineering
> Carnegie Mellon University
> Pittsburgh, PA 15213
> 412-268-7803
> @johnkitchin
> http://kitchingroup.cheme.cmu.edu

-- 
Rainer M. Krug

PGP: 0x0F52F982

Attachment: signature.asc
Description: PGP signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]