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. : - /
: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).