組織モードで2つの異なるコードブロックに共通のコードブロックを含めることはできますか?


12

私はorg-modeそれとは異なる要約を抽出するデータ二つのPythonコードブロックのテーブルを含むファイルを。

これらの2つのコードブロック間でいくつかの一般的な定数と関数を共有したいと思います。理想的には、他の2つのブロックのいずれかが評価されるたびに自動的に含まれて評価される別のコードブロックに共通コードをファクタリングすることでこれを行います。作成された構文では、次のようになります。

#+NAME: init_block
#+BEGIN_SRC python
  ... common constants and functions here ...
#+END_SRC

#+NAME: summary_1
#+BEGIN_SRC python :prepend init_block
  ... data-processing code depending on init code goes here ...
#+END_SRC

#+NAME: summary_2
#+BEGIN_SRC python :prepend init_block
  ... more processing which also depends on init code ...
#+END_SRC

私はこの:sessionオプションを使用できたと思いますが、2つの理由から、使用したくないでしょう。まず、C-c C-cコードブロックで使用するたびにゼロから実行するシステムではなく、ステートフルシステムをセットアップします。次に、関連して、ファイルを開くたびに共通の初期化コードを手動で評価することを覚えておく必要があります。データテーブルを更新し、サマリーブロックの1つに移動して更新するだけではできませんC-c C-c

これを行う良い方法はありますか?

回答:


15

これは、識字プログラミング用のorg-babelのnoweb参照構文を使用して最も簡単に行うことができます。以下に例を示します。

* Initialization block containing function definition
#+NAME: init_block
#+BEGIN_SRC python
  constant=19
  def some_function(x):
    return constant * x
#+END_SRC

* Call the function on an integer
#+BEGIN_SRC python :noweb yes 
  <<init_block>>
  return some_function(13)
#+END_SRC

#+RESULTS:
: 247

* Call the function on a string
:PROPERTIES:
:noweb:    yes
:END:

#+BEGIN_SRC python
  <<init_block>>
  return some_function('abc')
#+END_SRC

#+RESULTS:
: abcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabc

ありがとうございました。これは見栄えが良く、私のハック的なソリューションよりもはるかに優れています。数日中に試して、問題があるかどうかを確認します。
ジョンO.

@JonO。感謝-この答えはあなたのために働くならば、あなたは正しいと、それを受け入れてくださいます
非推奨の

4

もう少し考えた後、この問題の部分的な解決策を見つけました。を使用します:sessionが、少なくとも他のブロックの1つを評価する前に、共通の初期化コードが常に自動的に実行されることを確認できます。「トリック」は、ヘッダーブロックを参照するダミーヘッダー変数を使用して、毎回評価されるようにすることです。

#+NAME: init_block
#+BEGIN_SRC python :session t
  constant=19
  def some_function(x):
    return constant * x
#+END_SRC

#+BEGIN_SRC python :session t :var dummy=init_block
some_function(13)
#+END_SRC

#+RESULTS:
: 247

これでinit_block、定義を変更して、それを使用している別のブロックが評価されるたびに自動的に再評価すること:var dummy=init_blockができます。の定義init_blockがi等でステートレスであれば、これはうまく機能します。

(Pythonブロックを:sessionモードに変更するときreturnは、ブロックから値を返すために機能モードで必要なステートメントを削除する必要があることに注意してください)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.