Краткий ответ: используйте :cache yes
Некоторые дополнительные детали:
Режим Org имеет (возможно, это новый, так как вопрос был задан, но теперь существует) параметр :cache
. Суть в том, что вы устанавливаете :cache yes
в строке #+BEGIN_SRC
, а затем:
- Когда вы в первый раз запустите код (даже если результаты были сохранены ранее, он должен будет перезапустить его хотя бы один раз, при первом включении
:cache
), он будет кешировать результаты вывода как обычно, а также сохранить Хэш SHA1 состояния исходного кода (и любых входных данных, например, списков или таблиц, на которые есть ссылки), которые его сгенерировали.
- Затем, когда вы выполняете операцию, которая в противном случае оценивала бы код (будь то
org-babel-execute-src-block
(например, через Cc Cc) или одну из команд экспорта, она пересчитает контрольную сумму в исходном блоке и любых данных. входы, и только если они изменились, он снова запустит код.
Если у вас есть код, который имеет входные данные, которые явно не указаны в файле (например, он использует системное время или содержимое файла или чего-то еще), который может изменить результаты, вам придется отключить кэширование (или внести другие изменения), чтобы получить код для запуска снова. Но если все данные содержатся внутри файла org, они обычно должны кэшироваться, когда это необходимо, и заново генерировать, когда для этого есть причина.
Пример:
Ниже приведен надуманный пример, где у вас есть таблица результатов, которые люди каким-то образом достигли, и вы хотите сделать сводку данных.
Этот код будет работать , когда либо изменения таблицы или изменения кода (или оба), но до тех пор , как и остаются теми же, что контрольная сумма не изменится , и поэтому код не будет работать снова. Очевидно, что в этом конкретном примере это не такая уж большая проблема, но для кода, подобного тому, который вы упомянули, для его запуска может потребоваться много времени.
Пример фрагмента режима org с таблицей данных, исходным кодом и результатами:
** 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 |
Примечание:
Я обнаружил, что, например, выполнение org-html-export-to-html
перерассчитывает значения для вещей, когда это необходимо, но НЕ сохраняет их в разделах RESULTS
. Итак, что-то, о чем следует знать ... может потребоваться вычислить их только с помощью Cc Cc и экспортировать только после того, как это будет сделано. :-/