Blok kode yang menghasilkan tabel org untuk nanti dikonsumsi oleh blok kode lainnya

9

Saya mengalami sedikit masalah dengan blok kode yang menghasilkan tabel org untuk kemudian dikonsumsi oleh blok kode lainnya. Sebagai contoh:

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

akan menghasilkan

#+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 |

tapi yang benar-benar saya sukai adalah

#+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 |

(note #+RESULTSvs. #+TBLNAME) sehingga selanjutnya saya bisa melakukan sesuatu seperti

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

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

Dengan #+RESULTShasilnya, blok kode kedua akan menafsirkan data argumen sebagai string, bukan tabel data dan saya tidak akan dapat mengekstraksi data dengan cara langsung. Saya bisa mengonversi data ASCII ke struktur data Python 'secara manual', tetapi saya lebih suka org menanganinya untuk saya :-) Apakah ada cara untuk salah satu blok kode pertama untuk menghasilkan #+TBLNAMEbukan #+RESULTS? Atau, bisakah kode kedua memblokir argumen sebagai tabel org bukan string?

Julien Chastang
sumber
2
Biasanya, jika blok sumber Babel dimaksudkan untuk menghasilkan tabel, itu menghasilkan vektor dua dimensi. Jika kode Clojure melakukan itu alih-alih menghasilkan string, Anda tidak perlu mengubah apa pun dalam kode Anda. Mungkin mencoba mencari cara untuk menghasilkan vektor di Clojure?
wvxvw
@wvxvw Terima kasih atas komentarnya. Saya kira saya agak bingung di sini. Saya pikir seluruh mode titik org adalah teks biasa. Apa yang Anda lihat adalah apa yang Anda dapatkan. Tetapi Anda tampaknya menyarankan bahwa # + HASIL blok memiliki semacam struktur data di belakangnya yang dapat berupa String atau struktur data bersarang.
Julien Chastang
2
Tidak, bukan itu yang saya katakan. Saya percaya bahwa clojure.pprint/print-tablemengembalikan string yang diformat sebagai tabel Org, dan karena Anda menetapkan argumen header menjadi outputdan raw, Anda mendapatkan apa yang Anda dapatkan. Namun, ketika Anda menggunakannya untuk kedua kalinya, Org tidak membaca tabel yang dihasilkan, sebagai gantinya, ia mengevaluasi ulang blok Clojure dan mengumpankan hasilnya ke blok Python. Namun, jika blok Clojure menghasilkan array 2D, Anda bisa mengubah hasilnya menjadi valuebukan rawOrg untuk memformat hasil itu sebagai tabel, dan Anda akan mendapatkannya sebagai array 2D di blok Python.
wvxvw
@ wvxvw Terima kasih lagi untuk membantu saya memahami argumen header org-babel. Setelah beberapa percobaan, saya dapat melihat apa yang Anda gambarkan memang benar-benar menjadi masalahnya, dan saya seharusnya dapat menjalankannya. Namun, tampaknya saya tidak bisa saya tidak dapat menggunakan "lebih kaya" -gaya gaya-tabel dengan hline khususnya sebagai format perantara karena ini adalah data string dan bukan data (misalnya, vektor bersarang Clojure). Bagaimanapun, saya telah sangat senang dengan org-babel dan menganggapnya sebagai alternatif yang unggul untuk Jupyter (jika Anda adalah pengguna emacs, tentu saja :-)) Terima kasih lagi atas bantuan Anda.
Julien Chastang

Jawaban:

6

Anda perlu memiliki blok tabel Anda mengembalikan array (atau vektor atau daftar, dll ...) seperti ini. Anda bisa mendapatkan garis horizontal dengan Tidak Ada, atau nihil atau jenis apa pun yang setara di 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 |
John Kitchin
sumber