En emacs org-babel, ¿puedo exportar los resultados de ejecuciones anteriores en lugar de volver a evaluar en la exportación?

6

Tengo un documento de modo org con una serie de bloques de código. Algunos de estos tardan mucho tiempo en ejecutarse, por lo que no quiero volver a evaluarlos cada vez que hago una exportación.

Sé que puedo evitar la reevaluación configurando org-export-babel-eval en nil, pero cuando hago esto, tampoco se imprimirán los resultados de evaluaciones anteriores, incluso si tengo la opción de "resultados" del bloque de código establecer en "salida".

Sí, sé que puedo eliminar la línea "# + resultados:" antes del bloque de resultados a mano, pero esto se vuelve molesto cada vez que necesito reevaluar a mano, por ejemplo cuando hago un cambio de código.

Entonces, ¿cómo puedo conseguir que exporte los resultados anteriores en lugar de reevaluarlos cada vez?

EHN
fuente

Respuestas:

3

Desea establecer su argumento de encabezado para incluir :exports both o :exports results.

Por ejemplo (las diferencias en el tiempo se deben a la evaluación al crear los titulares con C-c C-c, Los dejé como tales para asegurarme de que no hubiera más evaluaciones):

* Testing - results
#+name: test
#+begin_src sh :exports results
  uptime
#+end_src

#+RESULTS:
| 15:49:23 up  2:00 | 2 users | load average: 0.00 | 0.0 | 0.0 |
* Testing - both
#+name: test
#+begin_src sh :exports both
  uptime
#+end_src

#+RESULTS:
| 15:50:02 up  2:01 | 2 users | load average: 0.00 | 0.0 | 0.0 |

Produce el siguiente ASCII C-c C-e A

1 Testing - results 
--------------------


  15:49:23 up  2:00   2 users   load average: 0.00   0.0   0.0  

2 Testing - both 
-----------------


  uptime

  15:50:02 up  2:01   2 users   load average: 0.00   0.0   0.0  
Jonathan Leech-Pepin
fuente
Intenté establecer :exports results en algún código de emacs-lisp, y todavía se evaluó en la exportación ... No estoy seguro de cuál es exactamente la diferencia, por lo que solo debo señalar que puede haber más en esto. (También: esto afecta lo que sucede en la salida, lo que puede o no ser deseable).
lindes
1

Con org-mode 9, puede evitar la ejecución de un bloque de origen durante la exportación con :eval no-export.

Desde el documentación :

never-export o no-export

Org no evaluará este bloque de código 'src' al exportar, pero el usuario puede evaluar este bloque fuente de forma interactiva.

Timm
fuente
0

Respuesta corta: usar :cache yes

Algunos detalles adicionales:

El modo Org tiene (quizás esto es nuevo desde que se hizo la pregunta, pero ahora existe) un :cache opción . Lo esencial es que se establece :cache yes sobre el #+BEGIN_SRC línea, y luego:

  • Cuando ejecute el código por primera vez (incluso si los resultados se almacenaron anteriormente, tendrá que volver a ejecutarlo al menos una vez, la primera vez que habilite :cache ), almacenará en caché los resultados de la salida como de costumbre, y también almacenará un SHA1 hash del estado de la código fuente (y cualquier entrada de datos, por ejemplo, listas o tablas a las que se hace referencia) que lo generaron.
  • Luego, cuando realice una operación que de otro modo evaluaría el código (si org-babel-execute-src-block (por ejemplo, a través de C-c C-c ), o uno de los comandos de exportación, volverá a calcular la suma de comprobación en el bloque fuente y cualquier entrada de datos , y solo si han cambiado volverá a ejecutar el código.

Si tiene un código que tiene entradas que no están enumeradas explícitamente en el archivo (por ejemplo, usa la hora del sistema o el contenido de un archivo o algo) que podría cambiar los resultados, tendrá que deshabilitar el almacenamiento en caché (o hacer algún otro cambio) para obtener Código para ejecutar de nuevo. Pero si los datos son todos autocontenidos dentro del archivo de la organización, por lo general, se debe almacenar en caché cuando se supone que debe hacerlo, y volver a generar cuando tenga una razón para hacerlo.

Ejemplo:

El siguiente es un ejemplo artificial en el que tiene una tabla de puntuaciones que las personas han logrado de alguna manera y desea hacer un resumen de los datos.

Este código se ejecutará cuando ya sea la mesa cambia o el código cambia (o ambos), pero mientras ambos permanezcan igual, la suma de comprobación no cambiará y, por lo tanto, el código no se ejecutará nuevamente. Obviamente, no es un gran problema en este ejemplo en particular, pero para un código como el que mencionas que tarda mucho tiempo en ejecutarse, podría ser.

Ejemplo de fragmento de modo de organización con tabla de datos, código fuente y resultados:

** Participants:

    #+NAME: mytable
    | Name  | Points |
    |-------+--------|
    | Alice |     30 |
    | Bob   |     20 |
    | Carol |     25 |
    | Dan   |     18 |

** Summary data:

    #+BEGIN_SRC emacs-lisp :cache yes :var data=mytable :exports results
      (let* ((scores (mapcar (lambda (row) (cadr row)) data))
             (sum (apply '+ scores))
             (avg (/ sum (length scores))))
        (list '("Total Score" "Average Score")
              'hline
              (list sum avg)))
    #+END_SRC

    #+RESULTS[a15af1d9cd34a76f4a6f822c36eccbc8bd493195]:
    | Total Score | Average Score |
    |-------------+---------------|
    |          93 |            23 |

nota al margen:

He descubierto que haciendo, por ejemplo, org-html-export-to-html parece volver a calcular los valores de las cosas cuando sea necesario, pero NO guárdalos en el RESULTS secciones Por lo tanto, algo de lo que hay que estar atento ... es posible que desee calcularlos solo con C-c C-c , y exportar solo después de que se haya hecho. : - /

lindes
fuente