我有一个包含大量代码块的 org-mode 文档。其中一些代码块需要很长时间才能运行,所以我不想每次导出时都重新评估它们。
我知道我可以通过将 org-export-babel-evaluate 设置为 nil 来阻止重新评估,但是当我执行此操作时,它也不会打印出以前评估的结果,即使我将代码块“结果”选项设置为“输出”。
是的,我知道我可以手动删除结果块之前的“#+results:”行,但每当我需要手动重新评估时,例如当我更改代码时,这会变得烦人。
那么,我怎样才能让它导出旧的结果而不是每次都重新评估?
答案1
使用 org-mode 9,您可以使用 来阻止在导出期间执行源块:eval no-export
。
来自文档:
never-export
或者no-export
Org 在导出时不会评估这个“src”代码块,但用户可以以交互方式评估这个源块。
答案2
您想要将标题参数设置为包含: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 |
生成以下 ASCIIC-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
答案3
简短回答:使用:cache yes
一些额外的细节:
Org-mode 有一个(也许这是自提出问题以来的新特性,但现在确实存在):cache
选项。要点是你设置:cache yes
就行#+BEGIN_SRC
,然后:
- 首次运行代码时(即使结果之前已存储,也必须在首次启用时至少重新运行一次
:cache
),它将照常缓存输出结果,并存储SHA1状态哈希值源代码(以及生成它的任何数据输入,例如引用列表或表格)。 - 然后,当你执行一个本来会评估代码的操作时(无论是
org-babel-execute-src-block
通过C-c C-c,还是其中一个导出命令),它都会重新计算源块和任何数据输入,并且只有当它们改变时,它才会再次运行代码。
如果您的代码包含文件中未明确列出的输入(例如,它使用系统时间或文件内容等),这可能会改变结果,则您必须禁用缓存(或进行其他更改)才能让代码再次运行。但如果数据全部包含在 org 文件中,它通常应该在需要时缓存,并在有理由时重新生成。
例子:
下面是一个虚构的例子,其中您有一个人们以某种方式取得的分数表,并且您希望对数据进行汇总。
此代码将在以下情况下运行任何一个表格发生变化或者代码会发生变化(或两者均发生变化),但只要两者保持不变,校验和就不会改变,因此代码不会再次运行。显然,在这个特定示例中这不是什么大问题,但对于您提到的需要很长时间才能运行的代码,这可能是个问题。
包含数据表、源代码和结果的 org-mode 代码片段示例:
** 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
部分中。因此,需要注意的是...可能只想使用来计算这些C-c C-c,然后仅在完成后才导出。:-/