後で他のコードブロックによって使用される組織テーブルを生成するコードブロック


9

後で他のコードブロックによって使用される組織テーブルを生成するコードブロックで少し問題があります。例えば:

#+NAME: upper_air
#+BEGIN_SRC clojure :results output raw
  (clojure.pprint/print-table table)
#+END_SRC 

生成されます

#+RESULTS: upper_air
|      :m | :degree | :meter/second |      :degC | :millibar |
|---------+---------+---------------+------------+-----------|
|  1545.0 |   175.0 |         12.36 |  15.400001 |     850.0 |
|  3162.0 |   265.0 |          6.69 |        4.8 |     700.0 |

でも本当に欲しいのは

#+TBLNAME: upper_air
|      :m | :degree | :meter/second |      :degC | :millibar |
|---------+---------+---------------+------------+-----------|
|  1545.0 |   175.0 |         12.36 |  15.400001 |     850.0 |
|  3162.0 |   265.0 |          6.69 |        4.8 |     700.0 |

(注#+RESULTS#+TBLNAME)ので、その後、私は次のようなことができるようになります

#+BEGIN_SRC ipython :session  :var data=upper_air
import numpy as np

arr = np.array(data)
p = arr[:,4]
#+END_SRC

その#+RESULTS結果、2番目のコードブロックはdata 引数をデータテーブルではなく文字列として解釈し、簡単な方法でデータを抽出できなくなります。「手動で」ASCIIデータをPythonデータ構造に変換することはできますが、組織で処理することをお勧めします:-)最初のコードブロックの#+TBLNAME代わりにを出力する方法はあり#+RESULTSますか?または、2番目のコードブロックで、引数を文字列ではなく組織テーブルとして強制できますか?


2
通常、Babelソースブロックがテーブルを生成することを意図している場合、2次元ベクトルが生成されます。Clojureコードが文字列を生成する代わりにそれを行った場合、コード内で何も変更する必要はありません。Clojureでベクターを作成する方法を探してみませんか?
wvxvw 2015

@wvxvwコメントありがとうございます。ここでは少し混乱しているようです。ポイントorgモード全体はプレーンテキストだと思いました。あなたが見たもの、それがあなたの手に入れたものだ。しかし、#+ RESULTSブロックの背後には、文字列またはネストされたデータ構造である、ある種のデータ構造があることを示唆しているようです。
Julien Chastang 2015

2
いいえ、それは私が言っていることではありません。私はそれclojure.pprint/print-tableがOrgテーブルとしてフォーマットされた文字列を返すと私は信じており、ヘッダー引数をoutputandに設定しているのでraw、あなたはあなたが得るものを得ます。ただし、2回目に使用すると、Orgは結果のテーブルを読み取らず、代わりにClojureブロックを再評価して、その結果をPythonブロックにフィードします。ただし、Clojureブロックが2D配列を生成した場合、Orgがその結果をテーブルとしてフォーマットしvalueないように結果を変更し、rawPythonブロックで2D配列として取得できます。
wvxvw 2015

@wvxvw org-babelヘッダー引数を理解してくれてありがとう。いくつかの実験の後、私はあなたの説明が実際にそうであるように見えるのを見ることができます、そして私はそれで走ることができるはずです。ただし、これらは文字列であり、Clojureのネストされたベクトルなどのデータ表現ではないため、特に中間形式として「リッチ」スタイルのorg-tablesを中間形式として使用できないようです。とにかく、私はorg-babelに非常に満足しており、Jupyterの優れた代替手段であると考えています(もちろん、emacsユーザーの場合:-))ご協力ありがとうございます。
Julien Chastang 2015

回答:


6

このような配列(またはベクトルやリストなど)をテーブルブロックに返す必要があります。水平線は、None、nil、またはclojureの同等のタイプで取得できます。

#+NAME: upper_air
#+BEGIN_SRC python :results value
return [[":m", ":degree",":meter/second", ":degC", ":millibar"],
        None,
        [1545.0, 175.0, 12.36, 15.40001, 850.0],
        [3162.0, 265.0, 6.69, 4.8, 700.0]]

#+END_SRC

#+RESULTS: upper_air
|     :m | :degree | :meter/second |    :degC | :millibar |
|--------+---------+---------------+----------+-----------|
| 1545.0 |   175.0 |         12.36 | 15.40001 |     850.0 |
| 3162.0 |   265.0 |          6.69 |      4.8 |     700.0 | 


#+BEGIN_SRC python :results value  :var data=upper_air
import numpy as np

arr = np.array(data)
p = arr[:,4]
return p
#+END_SRC  

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