No emacs org-babel, posso exportar os resultados de execuções anteriores em vez de reavaliar na exportação?

6

Eu tenho um documento de modo organizacional com vários blocos de código. Algumas demoram muito tempo para serem executadas, então não quero reavaliá-las toda vez que faço uma exportação.

Eu sei que posso impedir a reavaliação definindo o org-export-babel-evaluate como nil, mas quando faço isso, também não imprimo os resultados de avaliações anteriores, mesmo que eu tenha o bloco de código " resultados "opção definida como" saída ".

Sim, sei que posso remover a linha "# + results:" antes do bloco de resultados manualmente, mas isso é irritante sempre que preciso reavaliar à mão, por exemplo, quando faço uma alteração de código.

Então, como posso exportar os resultados antigos em vez de reavaliar cada vez?

    
por EHN 19.07.2011 / 17:04

3 respostas

3

Você deseja definir seu argumento de cabeçalho para incluir :exports both ou :exports results .

Por exemplo (As diferenças no tempo são devidas à avaliação ao criar as manchetes com C-c C-c , deixei-as assim para garantir que não houvesse avaliação adicional):

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

Produz o seguinte 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  
    
por 08.02.2012 / 21:52
1

Com o org-mode 9, você pode impedir a execução de um bloco de origem durante a exportação com :eval no-export .

A partir da documentação :

never-export or no-export

Org will not evaluate this ‘src’ code block when exporting, yet the user can evaluate this source block interactively.

    
por 18.06.2017 / 13:01
0

Resposta curta: use :cache yes

Alguns detalhes adicionais:

O Org-mode (talvez seja novo desde que a pergunta foi feita, mas agora existe) :cache option . A essência é que você define :cache yes na linha #+BEGIN_SRC e, em seguida:

  • Quando você executa o código pela primeira vez (mesmo que os resultados tenham sido armazenados anteriormente, ele precisará ser executado novamente pelo menos uma vez, na primeira vez que você ativar :cache ), ele armazenará em cache os resultados da saída normalmente. e também armazenar um hash SHA1 do estado do código-fonte (e quaisquer entradas de dados, por exemplo, listas ou tabelas referenciadas) que o geraram.
  • Então, quando você faz uma operação que avaliaria o código (seja org-babel-execute-src-block (por exemplo, via Cc Cc ), ou um dos comandos de exportação, ele recalculará a soma de verificação no < em> bloco de origem e quaisquer entradas de dados , e somente se eles tiverem mudado, ele executará o código novamente.

Se você tiver um código cuja entrada não tenha sido explicitamente listada no arquivo (por exemplo, usa a hora do sistema ou o conteúdo de um arquivo ou algo assim) que possa alterar os resultados, será necessário desativar o cache (ou fazer alguma outra alteração) para obter o código para executar novamente. Mas se os dados são todos auto-contidos dentro do arquivo org, geralmente deve armazenar em cache quando é suposto, e re-gerar quando tem um motivo para.

Exemplo:

A seguir, um exemplo inventado em que você tem uma tabela de pontuações que as pessoas conseguiram de alguma forma e você deseja fazer um resumo dos dados.

Este código será executado quando qualquer alteração da tabela ou o código for alterado (ou ambos), mas, desde que ambos permaneçam os mesmos, a soma de verificação não será alterada e, portanto, o código não será executado novamente. Obviamente, não é um grande negócio neste exemplo em particular, mas para código como você menciona que leva muito tempo para ser executado, pode ser.

Exemplo de snippet do modo organizacional com tabela de dados, código-fonte e 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 lateral:

Descobri que fazer, por exemplo, org-html-export-to-html parece recalcular os valores das coisas quando necessário, mas NÃO armazená-los nas seções RESULTS . Então, algo para estar ciente ... pode querer computá-los apenas com C-c C-c , e exportar somente depois de feito isso. : - /

    
por 24.02.2018 / 08:56