产生组织表的代码块,以后供其他代码块使用


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 |

(请注意#+RESULTSvs #+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
通常,如果要使用Babel源块生成表格,则会生成二维向量。如果Clojure代码执行此操作而不是生成字符串,则无需更改代码中的任何内容。也许尝试寻找在Clojure中产生载体的方法?
wvxvw

@wvxvw感谢您的评论。我想我在这里有些困惑。我认为整个Point org模式都是纯文本。你所看到的就是你得到的。但是您似乎在暗示#+ RESULTS块后面有某种数据结构,它可以是String或某些嵌套的数据结构。
朱利安·查斯唐

2
不,那不是我要说的。我相信这clojure.pprint/print-table将返回一个格式化为Org表的字符串,并且由于您将标头参数设置为outputraw,因此您得到了。但是,当您第二次使用它时,Org不会读取结果表,而是会重新评估Clojure块并将其结果提供给Python块。但是,如果Clojure块生成了2D数组,则可以将结果更改为,value而不是rawOrg将结果格式化为表格,然后将其作为Python块中的2D数组获取。
wvxvw

@wvxvw再次感谢您帮助我了解org-babel标头参数。经过一些试验,我可以看到您的描述确实确实是这种情况,我应该能够做到这一点。但是,看来我不能使用带hline的“更丰富”样式的组织表作为中间格式,因为它们是字符串而不是数据(例如,Clojure嵌套向量)表示形式。无论如何,我对org-babel非常满意,并认为它是Jupyter的替代产品(如果您是emacs用户,当然:-))再次感谢您的帮助。
朱利安·查斯唐

Answers:


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 |
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.