Блоки кода, которые создают таблицы 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 обрабатывал их для меня :-) Есть ли способ для вывода первого блока кода #+TBLNAMEвместо #+RESULTS? В качестве альтернативы, может ли второй блок кода привести аргумент в виде таблицы org вместо строки?

Жюльен Частанг
источник
2
Обычно, если исходный блок Babel предназначен для создания таблицы, он генерирует двумерный вектор. Если код Clojure сделал это вместо генерации строки, вам не пришлось бы ничего менять в своем коде. Может быть, попытаться найти способ создания вектора в Clojure?
wvxvw
@wvxvw Спасибо за комментарий. Я думаю, что я немного запутался здесь. Я думал, что весь режим точки орг является простым текстом. То, что вы видите, это то, что вы получаете. Но вы, похоже, предполагаете, что блок # + RESULTS имеет какую-то структуру данных, которая может быть строкой или некоторой вложенной структурой данных.
Жюльен Частанг
2
Нет, это не то, что я говорю. Я полагаю, что это clojure.pprint/print-tableвозвращает строку, отформатированную как таблица Org, и, поскольку вы устанавливаете аргумент заголовка равным outputи raw, вы получаете то, что получаете. Однако, когда вы используете его во второй раз, Org не читает результирующую таблицу, а переоценивает блок Clojure и передает свой результат в блок Python. Тем не менее, если блок Clojure создает 2D-массив, вы можете изменить результат на Org, valueа не rawна форматирование этого результата в виде таблицы, и вы получите его как 2D-массив в блоке Python.
wvxvw
@wvxvw Еще раз спасибо за помощь в понимании аргументов заголовка org-babel. После некоторых экспериментов я вижу, что то, что вы описываете, действительно соответствует действительности, и я должен быть в состоянии справиться с этим. Тем не менее, кажется, я не могу, я не могу использовать org-таблицы "более богатого" стиля с hline, в частности, в качестве промежуточного формата, поскольку это строки, а не представления данных (например, вложенного вектора Clojure). В любом случае, я был очень доволен org-babel и считаю его превосходной альтернативой Jupyter (если вы, конечно, пользователь emacs :-)) Еще раз спасибо за вашу помощь.
Жюльен Частанг

Ответы:

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 |
Джон Китчин
источник