Bloki kodu, które tworzą tabele organizacji, które zostaną później wykorzystane przez inne bloki kodu

9

Mam trochę problemów z blokami kodu, które tworzą tabele organizacji, które później mogą zostać wykorzystane przez inne bloki kodu. Na przykład:

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

będzie produkować

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

ale tak naprawdę chciałbym to

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

(uwaga #+RESULTSvs. #+TBLNAME), abym później mógł coś zrobić

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

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

W #+RESULTSwyniku tego drugi blok kodu zinterpretuje data argument jako ciąg zamiast tabeli danych i nie będę w stanie wyodrębnić danych w prosty sposób. Mógłbym przekonwertować dane ASCII na strukturę danych Pythona „ręcznie”, ale wolałbym, żeby org zajął się mną dla mnie :-) Czy istnieje sposób, aby pierwszy blok kodu wyprowadził #+TBLNAMEzamiast #+RESULTS? Alternatywnie, czy drugi blok kodu może wymusić argument jako tabelę org zamiast łańcucha?

Julien Chastang
źródło
2
Zwykle, jeśli blok źródłowy Babel ma tworzyć tabelę, generuje wektor dwuwymiarowy. Jeśli kod Clojure to zrobił zamiast generować ciąg, nie musiałbyś niczego zmieniać w kodzie. Może spróbuj znaleźć sposób na wyprodukowanie wektora w Clojure?
wvxvw
@wvxvw Dzięki za komentarz. Chyba jestem tu trochę zdezorientowany. Myślałem, że cały tryb org punktowych to zwykły tekst. To co widzisz Jest Tym Co dostajesz. Ale wydaje się, że sugerujesz, że blok # + RESULTS ma za sobą jakąś strukturę danych, która może być ciągiem lub zagnieżdżoną strukturą danych.
Julien Chastang
2
Nie, nie to mówię. Uważam, że clojure.pprint/print-tablezwraca ciąg sformatowany jako tabela Org, a ponieważ ustawiłeś argument nagłówka na outputi rawotrzymujesz to, co dostajesz. Jednak gdy użyjesz go drugi raz, Org nie czyta wynikowej tabeli, zamiast tego ponownie ocenia blok Clojure i podaje jego wynik do bloku Python. Jeśli jednak blok Clojure wytworzył tablicę 2D, możesz zmienić wynik na, valuea nie rawdla Org, aby sformatować ten wynik jako tabelę, a otrzymasz go jako tablicę 2D w bloku Pythona.
wvxvw
@wvxvw Jeszcze raz dziękuję za pomoc w zrozumieniu argumentów nagłówka org-babel. Po kilku eksperymentach widzę, że to, co opisujesz, rzeczywiście tak jest, i powinienem być w stanie z tym biegać. Wygląda jednak na to, że nie mogę użyć „bogatszych” tabel org w stylu hlines, szczególnie w formacie pośrednim, ponieważ są to ciągi znaków, a nie reprezentacje danych (np. Wektor zagnieżdżony Clojure). W każdym razie jestem bardzo zadowolony z org-babel i uważam to za lepszą alternatywę dla Jupytera (jeśli jesteś użytkownikiem emacsa, oczywiście :-)) Jeszcze raz dziękuję za pomoc.
Julien Chastang

Odpowiedzi:

6

Musisz mieć blok tabeli zwracający tablicę (lub wektor lub listę itp.) W ten sposób. Możesz uzyskać poziome linie za pomocą None, zero lub podobnego typu w 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
źródło