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:57:34 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.4 (darwin)

Rainer M Krug <address@hidden> writes:

> 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.

Just realised that it produces an error if the code block has no name.

Cheers,

Rainer

>
> 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
email: Rainer<at>krugs<dot>de
PGP: 0x0F52F982

Attachment: signature.asc
Description: PGP signature


reply via email to

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