Bloques de código que producen tablas de organización para luego ser consumidas por otros bloques de código

9

Tengo algunos problemas con los bloques de código que producen tablas de organización para luego ser consumidas por otros bloques de código. Por ejemplo:

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

Producirá

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

pero lo que realmente me gustaría es

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

(nota #+RESULTSvs. #+TBLNAME) para que posteriormente pueda hacer algo como

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

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

Con el #+RESULTSresultado, el segundo bloque de código interpretará el data argumento como una cadena en lugar de una tabla de datos y no podré extraer los datos de una manera directa. Podría convertir los datos ASCII a una estructura de datos de Python 'manualmente', pero preferiría que la organización lo maneje por mí :-) ¿Hay alguna forma de que el primer bloque de código genere un en #+TBLNAMElugar de #+RESULTS? Alternativamente, ¿puede el segundo bloque de código coaccionar el argumento como una tabla de organización en lugar de una cadena?

Julien Chastang
fuente
2
Normalmente, si un bloque fuente de Babel está destinado a producir una tabla, genera un vector bidimensional. Si el código Clojure hiciera eso en lugar de generar una cadena, no tendría que cambiar nada en su código. ¿Quizás intente buscar una manera de producir un vector en Clojure?
wvxvw
@wvxvw Gracias por el comentario. Supongo que estoy un poco confundido aquí. Pensé que todo el modo de organización de puntos es texto sin formato. Lo que ves, es lo que tienes. Pero parece estar sugiriendo que el bloque # + RESULTADOS tiene algún tipo de estructura de datos detrás que puede ser una Cadena o una estructura de datos anidada.
Julien Chastang
2
No, eso no es lo que digo. Creo que eso clojure.pprint/print-tabledevuelve una cadena con formato de tabla Org, y dado que configura el argumento de encabezado como outputy raw, obtiene lo que obtiene. Sin embargo, cuando lo usa por segunda vez, Org no lee la tabla resultante, sino que vuelve a evaluar el bloque Clojure y alimenta su resultado al bloque Python. Sin embargo, si el bloque Clojure produjo una matriz 2D, puede cambiar el resultado para que sea valuey no rawpara que Org formatee ese resultado como una tabla, y lo obtendría como una matriz 2D en el bloque Python.
wvxvw
@wvxvw Gracias de nuevo por ayudarme a comprender los argumentos del encabezado org-babel. Después de un poco de experimentación, puedo ver que lo que usted describe parece ser el caso, y debería poder ejecutarlo. Sin embargo, parece que no puedo no puedo usar tablas orgánicas de estilo "más rico" con hlines en particular como formato intermedio ya que estas son cadenas y no representaciones de datos (por ejemplo, vector anidado Clojure). En cualquier caso, he estado muy contento con org-babel y lo considero una alternativa superior a Jupyter (si eres un usuario de emacs, por supuesto :-)) Gracias de nuevo por tu ayuda.
Julien Chastang

Respuestas:

6

Necesita que su bloque de tabla devuelva una matriz (o vector o lista, etc.) como esta. Puede obtener líneas horizontales con None, o nil o cualquier tipo equivalente en 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
fuente