Codeblöcke, die Organisationstabellen erzeugen, die später von anderen Codeblöcken verwendet werden

9

Ich habe ein paar Probleme mit Codeblöcken, die Organisationstabellen erzeugen, die später von anderen Codeblöcken verwendet werden. Beispielsweise:

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

wird herstellen

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

aber was ich wirklich gerne hätte ist

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

(Anmerkung #+RESULTSvs. #+TBLNAME) damit ich später so etwas machen kann

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

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

Mit dem #+RESULTSErgebnis interpretiert der zweite Codeblock das data Argument als Zeichenfolge anstelle einer Datentabelle, und ich kann die Daten nicht auf einfache Weise extrahieren. Ich könnte die ASCII-Daten 'manuell' in eine Python-Datenstruktur konvertieren, aber ich würde es vorziehen, wenn org sie für mich handhabt :-) Gibt es eine Möglichkeit, dass einer der ersten Codeblöcke a #+TBLNAMEanstelle von ausgibt #+RESULTS? Kann der zweite Codeblock das Argument alternativ als org-Tabelle anstelle einer Zeichenfolge erzwingen?

Julien Chastang
quelle
2
Wenn ein Babel-Quellblock eine Tabelle erzeugen soll, erzeugt er normalerweise einen zweidimensionalen Vektor. Wenn der Clojure-Code dies tun würde, anstatt eine Zeichenfolge zu generieren, müssten Sie nichts an Ihrem Code ändern. Versuchen Sie vielleicht, einen Weg zu finden, um in Clojure einen Vektor zu erzeugen?
wvxvw
@wvxvw Danke für den Kommentar. Ich bin hier wohl etwas verwirrt. Ich dachte, der gesamte Punkt-Organisationsmodus ist einfacher Text. Was du siehst ist was du kriegst. Sie scheinen jedoch darauf hinzuweisen, dass der Block # + RESULTS eine Art Datenstruktur enthält, die ein String oder eine verschachtelte Datenstruktur sein kann.
Julien Chastang
2
Nein, das sage ich nicht. Ich glaube, das clojure.pprint/print-tablegibt eine Zeichenfolge zurück, die als Org-Tabelle formatiert ist, und da Sie das Header-Argument auf outputund setzen raw, erhalten Sie, was Sie erhalten. Wenn Sie es jedoch zum zweiten Mal verwenden, liest Org die resultierende Tabelle nicht, sondern wertet den Clojure-Block neu aus und gibt das Ergebnis an den Python-Block weiter. Wenn jedoch der Clojure Block eine 2D - Array erzeugt, könnten Sie das Ergebnis ändern zu sein valueund nicht rawfür Org zu Format , das Ergebnis als Tabelle, und Sie würden es als ein 2D - Array in Python Block erhalten.
wvxvw
@wvxvw Nochmals vielen Dank, dass Sie mir geholfen haben, die Argumente der org-babel-Header zu verstehen. Nach einigen Experimenten kann ich sehen, was Sie tatsächlich beschreiben, und ich sollte in der Lage sein, damit zu rennen. Es scheint jedoch, dass ich nicht kann. Ich kann keine "reichhaltigeren" Organisationstabellen mit hlines insbesondere als Zwischenformat verwenden, da dies Zeichenfolgen und keine Darstellungen von Daten (z. B. verschachtelte Clojure-Vektoren) sind. Auf jeden Fall war ich sehr zufrieden mit org-babel und halte es für eine überlegene Alternative zu Jupyter (wenn Sie ein Emacs-Benutzer sind, natürlich :-)) Nochmals vielen Dank für Ihre Hilfe.
Julien Chastang

Antworten:

6

Ihr Tabellenblock muss ein Array (oder einen Vektor oder eine Liste usw.) wie dieses zurückgeben. Sie können horizontale Linien mit None oder nil oder einem anderen äquivalenten Typ in clojure erhalten.

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