Кодові блоки, які створюють таблиці таблиць org, які згодом будуть споживатися іншими кодовими блоками


9

У мене виникають проблеми з кодовими блоками, які створюють таблиці таблиць org, які згодом використовуються іншими кодовими блоками. Наприклад:

#+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результаті другий блок коду буде інтерпретувати data аргумент як рядок замість таблиці даних, і я не зможу витягнути дані прямо. Я міг би перетворити дані ASCII в структуру даних Python "вручну", але я вважаю за краще org обробляти це для мене :-) Чи існує спосіб, щоб перший блок коду вийшов a #+TBLNAMEзамість #+RESULTS? Або, чи може другий блок коду примусити аргумент як таблиця org замість рядка?


2
Як правило, якщо вихідний блок Бабеля призначений для створення таблиці, він генерує двовимірний вектор. Якби код Clojure зробив це замість генерації рядка, вам не доведеться нічого змінювати у своєму коді. Може, спробуйте шукати спосіб отримання вектора в Clojure?
wvxvw

@wvxvw Дякуємо за коментар. Напевно, я тут трохи розгублений. Я думав, що весь режим органу - це звичайний текст. Отримуєш те, що бачиш. Але вам здається, ви припускаєте, що блок # + РЕЗУЛЬТАТИ має якусь структуру даних за собою, яка може бути рядком або деякою вкладеною структурою даних.
Жульєн Частанг

2
Ні, це не те, що я говорю. Я вважаю, що clojure.pprint/print-tableповертає рядок, відформатовану як таблицю Org, і оскільки ви встановите аргумент заголовка таким чином, outputі rawви отримуєте те, що отримуєте. Однак, коли ви використовуєте його вдруге, Org не читає отриману таблицю, натомість він повторно оцінює блок Clojure і подає його результат до блоку Python. Однак, якби блок Clojure створив 2D масив, ви можете змінити результат на, valueа не rawдля Org, щоб форматувати цей результат у вигляді таблиці, і ви отримаєте його як 2D масив у блоці Python.
wvxvw

@wvxvw Ще раз дякую, що допомогли мені зрозуміти аргументи заголовка org-babel. Після деяких експериментів я можу побачити, що ви описуєте, справді, здається, саме так, і я повинен мати можливість з цим працювати. Однак, схоже, я не можу використати "більш багаті" у таблиці таблиці-орґіни з рядками, зокрема, як проміжний формат, оскільки це рядки, а не дані (наприклад, вкладений вектор Clojure). У будь-якому випадку, я був дуже задоволений org-babel і вважаю це чудовою альтернативою Юпітеру (якщо ви користувач emacs, звичайно :-)) Ще раз дякую за вашу допомогу.
Жульєн Частанг

Відповіді:


6

Потрібно, щоб ваш блок таблиці повернув такий масив (або вектор, список тощо). Ви можете отримати горизонтальні лінії з None, або нулем або будь-яким іншим еквівалентним типом у 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 |
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.