Các khối mã tạo ra các bảng org để sau đó được sử dụng bởi các khối mã khác


9

Tôi gặp một chút rắc rối với các khối mã tạo ra các bảng org để sau đó được sử dụng bởi các khối mã khác. Ví dụ:

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

sẽ sản xuất

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

nhưng điều tôi thực sự muốn là

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

(lưu ý #+RESULTSso với #+TBLNAME) để sau đó tôi có thể làm một cái gì đó như

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

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

Với #+RESULTSkết quả, khối mã thứ hai sẽ diễn giải data đối số dưới dạng chuỗi thay vì bảng dữ liệu và tôi sẽ không thể trích xuất dữ liệu theo cách đơn giản. Tôi có thể chuyển đổi dữ liệu ASCII thành cấu trúc dữ liệu Python 'thủ công', nhưng tôi muốn org xử lý nó cho tôi :-) Có cách nào để khối mã đầu tiên xuất ra #+TBLNAMEthay thế #+RESULTSkhông? Ngoài ra, khối mã thứ hai có thể ép buộc đối số dưới dạng bảng org thay vì chuỗi không?


2
Thông thường, nếu một khối nguồn Babel có nghĩa là để tạo ra một bảng, nó sẽ tạo ra một vectơ hai chiều. Nếu mã Clojure đã làm điều đó thay vì tạo một chuỗi, bạn sẽ không phải thay đổi bất cứ điều gì trong mã của mình. Có thể thử tìm cách tạo ra một vectơ trong Clojure?
wvxvw

@wvxvw Cảm ơn bình luận. Tôi đoán tôi có một chút bối rối ở đây. Tôi nghĩ rằng toàn bộ chế độ điểm org là văn bản thuần túy. Những gì bạn thấy là những gì bạn nhận được. Nhưng dường như bạn đang đề xuất rằng khối # + KẾT QUẢ có một số loại cấu trúc dữ liệu đằng sau nó có thể là Chuỗi hoặc một số cấu trúc dữ liệu lồng nhau.
Julien Chastang

2
Không, đó không phải là những gì tôi đang nói. Tôi tin rằng clojure.pprint/print-tabletrả về một chuỗi được định dạng dưới dạng bảng Org và vì bạn đặt đối số tiêu đề thành outputraw, bạn sẽ nhận được những gì bạn nhận được. Tuy nhiên, khi bạn sử dụng nó lần thứ hai, Org không đọc bảng kết quả, thay vào đó, nó đánh giá lại khối Clojure và đưa kết quả của nó vào khối Python. Tuy nhiên, nếu khối Clojure tạo ra một mảng 2D, bạn có thể thay đổi kết quả thành valuevà không rawcho Org định dạng kết quả đó dưới dạng bảng và bạn sẽ lấy nó thành mảng 2D trong khối Python.
wvxvw

@wvxvw Cảm ơn một lần nữa vì đã giúp tôi hiểu các đối số tiêu đề org-babel. Sau một số thử nghiệm, tôi có thể thấy những gì bạn mô tả thực sự có vẻ là trường hợp, và tôi sẽ có thể chạy với điều đó. Tuy nhiên, có vẻ như tôi không thể sử dụng các bảng cực đại kiểu "phong phú" hơn với các đường đặc biệt là định dạng trung gian vì đây là các chuỗi và không phải là biểu diễn dữ liệu (ví dụ: vectơ lồng nhau Clojure). Dù sao đi nữa, tôi đã rất hạnh phúc với org-babel và coi nó là một sự thay thế vượt trội so với Jupyter (tất nhiên nếu bạn là người dùng emacs, dĩ nhiên :-)) Cảm ơn lần nữa vì sự giúp đỡ của bạn.
Julien Chastang

Câu trả lời:


6

Bạn cần phải có khối bảng của bạn trả về một mảng (hoặc vector hoặc danh sách, v.v ...) như thế này. Bạn có thể nhận được các đường ngang với Không, hoặc không hoặc bất kỳ loại tương đương nào trong 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 |
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.