Blocos de código que produzem tabelas organizacionais para serem posteriormente consumidos por outros blocos de código

9

Estou com alguns problemas com blocos de código que produzem tabelas organizacionais para serem posteriormente consumidos por outros blocos de código. Por exemplo:

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

vai produzir

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

mas o que eu realmente gostaria é

#+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, eu possa fazer algo como

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

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

Com o #+RESULTSresultado, o segundo bloco de código interpretará o data argumento como uma sequência em vez de uma tabela de dados e não poderei extrair os dados de maneira direta. Eu poderia converter os dados ASCII em uma estrutura de dados Python 'manualmente', mas eu preferiria a organização lidar comigo :-) Existe uma maneira de o primeiro bloco de código gerar um em #+TBLNAMEvez de #+RESULTS? Como alternativa, o segundo bloco de código pode coagir o argumento como uma tabela organizacional em vez de uma sequência?

Julien Chastang
fonte
2
Normalmente, se um bloco de origem Babel pretende produzir uma tabela, ele gera um vetor bidimensional. Se o código Clojure fizesse isso em vez de gerar uma sequência, você não precisaria alterar nada no seu código. Talvez tente procurar uma maneira de produzir um vetor no Clojure?
Wvxvw
@wvxvw Obrigado pelo comentário. Acho que estou um pouco confuso aqui. Eu pensei que todo o modo org de ponto é texto sem formatação. O que você vê é o que você recebe. Mas você parece estar sugerindo que o bloco # + RESULTS possui algum tipo de estrutura de dados, que pode ser uma String ou alguma estrutura de dados aninhada.
Julien Chastang
2
Não, não é isso que estou dizendo. Eu acredito que clojure.pprint/print-tableretorna uma string formatada como tabela Org e, desde que você defina o argumento do cabeçalho como outpute raw, você obtém o que obtém. No entanto, quando você a usa pela segunda vez, a Org não lê a tabela resultante. Em vez disso, reavalia o bloco Clojure e alimenta seu resultado no bloco Python. No entanto, se o bloco Clojure produzisse uma matriz 2D, você poderia alterar o resultado para ser valuee não rawpara a Org formatar esse resultado como uma tabela e obtê-lo como uma matriz 2D no bloco Python.
Wvxvw 30/07/2015
@wvxvw Obrigado novamente por me ajudar a entender os argumentos do cabeçalho org-babel. Depois de alguma experimentação, posso ver o que você descreve realmente parece ser o caso, e devo ser capaz de continuar com isso. No entanto, parece que não posso. Não posso usar tabelas organizacionais de estilo "mais rico", com linhas de linhas em particular como um formato intermediário, pois são seqüências de caracteres e não representações de dados (por exemplo, vetor aninhado Clojure). De qualquer forma, fiquei super feliz com o org-babel e considero uma alternativa superior ao Jupyter (se você é um usuário do emacs, é claro :-)) Obrigado novamente por sua ajuda.
Julien Chastang

Respostas:

6

Você precisa que seu bloco de tabela retorne uma matriz (ou vetor ou lista, etc ...) como esta. Você pode obter linhas horizontais com Nenhum, ou nulo ou qualquer outro tipo equivalente no 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
fonte