6

У меня есть документ в режиме org с несколькими кодовыми блоками. Некоторые из них занимают много времени, поэтому я не хочу переоценивать их каждый раз, когда делаю экспорт.

Я знаю, что могу предотвратить повторную оценку, установив для org-export-babel -valu значение nil, но когда я сделаю это, он также не будет распечатывать результаты предыдущих оценок, даже если у меня есть опция "results" блока кода установить на "выход".

Да, я знаю, что могу удалить строку «#+results:» перед блоком результатов вручную, но это раздражает всякий раз, когда мне нужно выполнить повторную оценку вручную, например, когда я делаю изменение кода.

Итак, как я могу заставить его экспортировать старые результаты, а не переоценивать каждый раз?

3 ответа3

3

Вы хотите установить свой аргумент заголовка, чтобы включить :exports both или :exports results .

Например (Разница во времени связана с оценкой при создании заголовков с помощью C-c C-c , я оставил их как таковые, чтобы не было дальнейшей оценки):

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

Производит следующий 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  
1

В режиме org 9 вы можете запретить выполнение исходного блока во время экспорта с помощью :eval no-export .

Из документации:

never-export или no-export

Org не будет оценивать этот блок кода src при экспорте, но пользователь может оценить этот исходный блок в интерактивном режиме.

0

Краткий ответ: используйте :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 и экспортировать только после того, как это будет сделано. :-/

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .