Blocs de code qui produisent des tables d'organisation à utiliser ultérieurement par d'autres blocs de code

9

J'ai un peu de mal avec les blocs de code qui produisent des tables d'organisation qui seront ensuite consommées par d'autres blocs de code. Par exemple:

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

produira

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

mais ce que j'aimerais vraiment c'est

#+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) pour que je puisse ensuite faire quelque chose comme

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

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

Avec le #+RESULTSrésultat, le deuxième bloc de code interprétera l' data argument comme une chaîne au lieu d'une table de données et je ne pourrai pas extraire les données de manière simple. Je pourrais convertir les données ASCII en une structure de données Python «manuellement», mais je préférerais que l'organisation s'en occupe pour moi :-) Existe-t-il un moyen pour le premier bloc de code de produire un #+TBLNAMEau lieu de #+RESULTS? Alternativement, le deuxième bloc de code peut-il contraindre l'argument en tant que table org au lieu d'une chaîne?

Julien Chastang
la source
2
Normalement, si un bloc source Babel est destiné à produire une table, il génère un vecteur bidimensionnel. Si le code Clojure faisait cela au lieu de générer une chaîne, vous n'auriez rien à changer dans votre code. Peut-être essayez-vous de trouver un moyen de produire un vecteur à Clojure?
wvxvw
@wvxvw Merci le commentaire. Je suppose que je suis un peu confus ici. Je pensais que tout le mode org point était du texte brut. Ce que vous voyez est ce que vous obtenez. Mais vous semblez suggérer que le bloc # + RESULTS a une sorte de structure de données derrière lui qui peut être une chaîne ou une structure de données imbriquée.
Julien Chastang
2
Non, ce n'est pas ce que je dis. Je crois que cela clojure.pprint/print-tablerenvoie une chaîne au format Org table, et puisque vous définissez l'argument d'en-tête sur outputet raw, vous obtenez ce que vous obtenez. Cependant, lorsque vous l'utilisez une deuxième fois, Org ne lit pas la table résultante, mais réévalue le bloc Clojure et transmet son résultat au bloc Python. Cependant, si le bloc Clojure produisait un tableau 2D, vous pourriez changer le résultat pour être valueet non rawpour Org pour formater ce résultat sous forme de tableau, et vous l'obtiendriez comme un tableau 2D dans un bloc Python.
wvxvw
@wvxvw Merci encore de m'avoir aidé à comprendre les arguments de l'en-tête org-babel. Après une certaine expérimentation, je peux voir que ce que vous décrivez semble effectivement être le cas, et je devrais pouvoir courir avec ça. Cependant, il semble que je ne peux pas, je ne peux pas utiliser des tables d'organisation de style "plus riche" avec des hlines en particulier comme format intermédiaire car ce sont des chaînes et non des représentations de données (par exemple, un vecteur imbriqué Clojure). En tout cas, j'ai été très satisfait de org-babel et je le considère comme une alternative supérieure à Jupyter (si vous êtes un utilisateur emacs, bien sûr :-)) Merci encore pour votre aide.
Julien Chastang

Réponses:

6

Vous devez avoir votre bloc de table renvoyer un tableau (ou vecteur ou liste, etc ...) comme celui-ci. Vous pouvez obtenir des lignes horizontales avec None, ou nil ou tout autre type équivalent dans 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
la source