บล็อคโค้ดที่สร้างตารางองค์กรที่จะใช้ในภายหลังโดยบล็อกโค้ดอื่น ๆ


9

ฉันมีปัญหาเล็กน้อยกับบล็อคโค้ดที่สร้างตาราง org เพื่อใช้ในภายหลังโดยบล็อคโค้ดอื่น ตัวอย่างเช่น:

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

จะผลิต

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

แต่สิ่งที่ฉันต้องการคือ

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

(หมายเหตุ#+RESULTSกับ#+TBLNAME) ดังนั้นต่อมาฉันก็สามารถทำอะไรบางอย่างเช่น

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

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

ด้วย#+RESULTSผลลัพธ์บล็อกโค้ดที่สองจะตีความdata อาร์กิวเมนต์เป็นสตริงแทนที่จะเป็นตารางข้อมูลและฉันจะไม่สามารถแยกข้อมูลในลักษณะที่ตรงไปตรงมา ฉันสามารถแปลงข้อมูล ASCII เป็นโครงสร้างข้อมูล Python 'ด้วยตนเอง' แต่ฉันต้องการ org จัดการกับมันสำหรับฉัน :-) มีวิธีใดบ้างในการบล็อกโค้ดแรกที่ให้ผลลัพธ์#+TBLNAMEแทนที่จะเป็น#+RESULTS? บล็อกโค้ดที่สองสามารถบังคับให้อาร์กิวเมนต์เป็นตาราง org แทนที่จะเป็นสตริงได้หรือไม่?


2
โดยปกติหากบล็อกต้นฉบับของ Babel มีวัตถุประสงค์เพื่อสร้างตารางจะสร้างเวกเตอร์สองมิติ หากรหัส Clojure ทำเช่นนั้นแทนที่จะสร้างสตริงคุณจะไม่ต้องเปลี่ยนแปลงอะไรในรหัสของคุณ อาจลองหาวิธีสร้างเวกเตอร์ใน Clojure ใช่ไหม
wvxvw

@wvxvw ขอบคุณความคิดเห็น ฉันคิดว่าฉันสับสนเล็กน้อยที่นี่ ฉันคิดว่าโหมดจุดทั้งองค์กรเป็นข้อความธรรมดา สิ่งที่คุณเห็นคือสิ่งที่คุณได้รับ. แต่คุณดูเหมือนจะแนะนำว่าบล็อก # + RESULTS มีโครงสร้างข้อมูลบางประเภทอยู่ด้านหลังซึ่งอาจเป็นสตริงหรือโครงสร้างข้อมูลที่ซ้อนกัน
Julien Chastang

2
ไม่นั่นไม่ใช่สิ่งที่ฉันพูด ฉันเชื่อว่าการclojure.pprint/print-tableส่งคืนสตริงที่จัดรูปแบบเป็นตาราง Org และเมื่อคุณตั้งค่าอาร์กิวเมนต์ส่วนหัวให้เป็นoutputและrawคุณจะได้รับสิ่งที่คุณได้รับ อย่างไรก็ตามเมื่อคุณใช้งานเป็นครั้งที่สอง Org จะไม่อ่านตารางผลลัพธ์ แต่จะประเมินบล็อก Clojure อีกครั้งและส่งผลลัพธ์ไปยังบล็อก Python อย่างไรก็ตามหากบล็อก Clojure สร้างอาร์เรย์ 2 มิติคุณสามารถเปลี่ยนผลลัพธ์ที่จะเป็นvalueและไม่rawให้องค์กรจัดรูปแบบผลลัพธ์เป็นตารางและคุณจะได้รับมันเป็นอาร์เรย์ 2 มิติในบล็อกหลาม
wvxvw

@wvxvw ขอบคุณอีกครั้งที่ช่วยให้ฉันเข้าใจข้อโต้แย้งส่วนหัว org-babel หลังจากการทดลองบางอย่างฉันสามารถเห็นสิ่งที่คุณอธิบายได้จริง ๆ แล้วเป็นเรื่องจริงและฉันควรจะสามารถทำงานได้ อย่างไรก็ตามปรากฏว่าฉันไม่สามารถใช้ "org ยิ่งขึ้น" - สไตล์ org-tables ที่มี hlines โดยเฉพาะเป็นรูปแบบสื่อกลางเนื่องจากเป็นสตริงและไม่ใช่ข้อมูล (เช่นเวกเตอร์ซ้อนกัน Clojure) อย่างไรก็ตามฉันมีความสุขสุด ๆ กับ org-babel และคิดว่ามันเป็นทางเลือกที่ดีกว่าสำหรับ Jupyter (ถ้าคุณเป็นผู้ใช้ emacs แน่นอน :-)) ขอบคุณอีกครั้งสำหรับความช่วยเหลือของคุณ
Julien Chastang

คำตอบ:


6

คุณต้องให้บล็อกตารางของคุณคืนค่าอาร์เรย์ (หรือเวกเตอร์หรือรายการ ฯลฯ ... ) เช่นนี้ คุณสามารถรับเส้นแนวนอนด้วยไม่มีหรือไม่มีหรือประเภทใดเทียบเท่าใน 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 |
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.