Org-babel के साथ, फ़ंक्शन कॉल के परिणामों को कैसे नाम दें और उनका पुन: उपयोग करें


9

में org-mode, मैं एक फ़ंक्शन, एक वेरिएबल को परिभाषित करने की कोशिश कर रहा हूं, और फिर दूसरे वेरिएबल को पहले वेरिएबल पर फ़ंक्शन कॉल का परिणाम बता रहा हूं। हालाँकि, तब ऐसा लगता है कि मैं इस नए चर का उपयोग बाद के कार्यों में नहीं कर सकता।

फंक्शन कॉल्स को इनलाइन करना काम करता है, लेकिन पहले वैरिएबल पर वैल्यू को प्रभावित करने से पहले फंक्शन कॉल्स में कुछ गलत होने की स्थिति में तेजी से डिबग हो सकती है और संभावित महंगी कंपीटिशन को डुप्लिकेट करने से बचना होगा।

MWE: ( (require 'ob-emacs-lisp)यदि आवश्यक हो तो उपयोग करें )

#+name: square
#+begin_src emacs-lisp :var x=3
  (message (format "%s" (* x x)))
#+end_src

#+RESULTS: square
: 9

#+name: value
: 45

#+name: squaredvalue
#+call: square(x=value)

#+RESULTS: squaredvalue
: 2025

Now I try to reuse this value: 

#+begin_src emacs-lisp :var res=squaredvalue
  (message res)
#+end_src

#+RESULTS:
: nil

Inlined calls do work:    

#+begin_src emacs-lisp :var res=square(value)
  (message res)
#+end_src

#+RESULTS:
: 2025

दूसरे कोड ब्लॉक शो का विस्तार:

(let ((res (quote "nil")))
  (message res))

मैं क्या खो रहा हूँ?

(यह एमआर 8.2.10 का उपयोग करके एमएसीएस 24.3.1, 24.4 और 24.5 पर परीक्षण किया गया है)


मुझे लगता है कि लाइब्रेरी के बेबेल के साथ कुछ करना है।
yi.tang.uni

जवाबों:


7

स्पष्ट रूप #+name:से #+results:ब्लॉक के ऊपर नया जोड़ें ।

नोट: अतिरिक्त भ्रम पैदा (message res)करने (message (format "%s" res))से रोकने के लिए अपना कोड अपडेट करें Wrong type argument: stringp, 2025

#+name: square
#+begin_src emacs-lisp :var x=3 
  (message (format "%s" (* x x)))
#+end_src

#+RESULTS: square
: 9

#+name: value
: 45

#+name: squaredvalue
#+call: square(x=value)

#+name: squaredvalue-results
#+RESULTS: squaredvalue
: 2025

#+begin_src emacs-lisp :var res=squaredvalue
   (message (format "%s" res))
#+end_src

#+RESULTS:
: nil


#+begin_src emacs-lisp :var res=squaredvalue-results
 (message (format "%s" res)) 
#+end_src

#+RESULTS:
: 2025


GNU Emacs 24.4.1 (x86_64-अज्ञात-साइबरविन, GTK + संस्करण 3.10.9) Org-
मोड संस्करण का उपयोग कर परीक्षण किया गया : 8.2.10


ठीक है, यह निश्चित रूप से आज तक का सबसे सरल समाधान है। इस मामले में, वास्तव #+name:में #+call:लाइन से पहले की कोई आवश्यकता नहीं है , इसलिए यह प्रक्रिया में कोई बहीखाता नहीं जोड़ता है: केवल परिभाषा के बजाय परिणामों को नाम दें। शायद यह उतना स्वाभाविक नहीं लगता जितना यह हो सकता है, लेकिन कम से कम यह वैकल्पिक समाधान के लिए भीख नहीं है।
टी। वेरॉन

यह अच्छा (+1) है। मैंने इसे आज़माया और यह ओआरजी-मोड 8.2.7c के साथ काम करता है। दिलचस्प है कि -resultरिटर्न के लिए ऑर्ग मोड की जानकारी प्रलेखन की खोज कोई परिणाम नहीं है। कृपया ध्यान दें कि कॉल का नामकरण आवश्यक है और परिणाम का नाम कॉल द्वारा प्रत्यय का नाम होना चाहिए -result। कम से कम जो मैंने नोट किया है। (यदि कोई नाम पुकारता है तो अगला पुनर्मूल्यांकन मौजूदा नाम परिणाम की अनदेखी करते हुए एक नया परिणाम जोड़ देगा।
टोबियास

@ टोबियास - केवल स्पष्ट करने के लिए, -resultइस उदाहरण के लिए मैंने केवल एक नामकरण सम्मेलन का उपयोग किया है। यदि आप स्पष्ट रूप से एक स्रोत ब्लॉक के परिणामों की तलाश कर रहे हैं, तो ()नाम को किसी अन्य ब्लॉक के लिए एक चर के रूप में या अब एक संदर्भ के अंदर पारित करते हुए नाम में जोड़ें।
मेलियोरैटस

1
लगता है कि केवल आवश्यकता है कि #+callनाम है। परिणाम का नाम मनमाना चुना जा सकता है। यदि कॉल को नाम नहीं दिया गया है तो कॉल से एक अतिरिक्त अनाम परिणाम रेखा उत्पन्न होती है।
तोबियास

क्या मैनुअल में कोई ऐसा खंड है जो उस व्यवहार का वर्णन करता है?
तोबियास

3

आप :post-routine का उपयोग कर सकते हैं जो परिणाम को आउटपुट करता है :name। अपने बबल-ब्लॉक को इस पोस्ट रूटीन के साथ कॉल करें और परिणाम को एक दराज में डालें। निम्नलिखित उदाहरण में इस पोस्ट का नाम रूटीन है asValue

#+name: asValue
#+begin_src emacs-lisp :var name="last" :var val=0 :results drawer
(format "#+NAME: %s\n: %s" name val)
#+end_src

#+name: square
#+begin_src emacs-lisp :var x=3
(message "Running square")
(* x x)
#+end_src

#+RESULTS: square
: 9

#+NAME: value
: 45

#+call: square(value) :post asValue(name="squaredValue",val=*this*) :results drawer

#+RESULTS:
:RESULTS:
#+NAME: squaredValue
: 2025
:END:

Now I try to reuse this value: 

#+begin_src emacs-lisp  :var res=squaredValue
  (format "Re-used value: %s" res)
#+end_src

#+RESULTS:
: Re-used value: 2025

कोड ब्लॉक की फिर से गणना से बचने का एक और तरीका है :cacheहेडर तर्क। यदि यह yesकोड ब्लॉक पर सेट है और इसके तर्कों को परिवर्तनों के लिए जांचा जाता है और यदि कोई परिवर्तन नहीं हैं तो स्रोत कोड ब्लॉक के पुनर्मूल्यांकन के बिना पिछले परिणाम का उपयोग किया जाता है।

* Running of source blocks with caching

#+name: square
#+begin_src emacs-lisp :cache yes :var x=4
(message "Running square")
(* x x)
#+end_src

#+RESULTS[31bcff57ec9977f9b237fdc62ab18b1378b8c646]: square
: 16

#+NAME: value
: 40

#+name: squaredValue
#+begin_src emacs-lisp :cache yes :var x=square(x=value)
x
#+end_src

#+RESULTS[f90a5856e446c3120f7e91c4b77959598078526e]: squaredValue
: 1600

Now I try to reuse this value: 

#+begin_src emacs-lisp  :var res=squaredValue
  (format "Re-used value: %s" res)
#+end_src

#+RESULTS:
: Re-used value: 1600

Re-trying with call:

#+NAME: value2
: 20

#+NAME: squaredResult
#+call: square(x=value2) :cache yes

#+RESULTS[2f7c47d4c609a1a49ce00b4696afb7b5a5517b97]: squaredResult
: 400

The last version gives the following error with org-mode 8.2.4 in emacs 24.3.1.
(I do not know why.)

Debugger entered--Lisp error: (wrong-type-argument integer-or-marker-p nil)
  org-babel-set-current-result-hash("94ef10d9192a0be25e46238df4cf05389ff69040")
  org-babel-lob-execute(("square(x=value2)" ":cache yes" 0 "squaredResult"))

हैक के लिए धन्यवाद! ऐसा लगता है कि दोनों समाधान काम करते हैं, लेकिन हम कुछ हद तक दूर हो रहे हैं "बस इसे आज़माएं, यह उसी तरह काम करेगा जैसे आप इसे करने की उम्मीद करते हैं" ओआरजी के दर्शन। यदि यह पता चलता है कि कोई अन्य समाधान नहीं है, तो मैं उत्तर स्वीकार करूंगा।
टी। वेरोन

@ T.Verron मुझे लगता है कि दूसरा समाधान ( :cache yes) मानक समाधान है। यह ओआरजी-मैनुअल में भी वर्णित है (देखें अनुभाग 14.8.2.16 :cache'). It is a pity that it does not smoothly work with # + कॉल . I think this is a bug. The first solution works with # + कॉल` और यह भी लाभ है कि यह पूरी तरह से कोड ब्लॉक को डिकॉउंस करता है। भले ही आप पहले कोड ब्लॉक को संपादित करते हैं और दूसरे को पहले वाला प्रयास करें। मूल्यांकन नहीं किया जाता है। (उस कार्य पर निर्भर करता है जो एक लाभ या एक असंतोष हो सकता है। आपको बस इसे ध्यान में रखना होगा।)
टोबियास

मैं कल रात थक गया था, मैंने ध्यान नहीं दिया ... यहां तक ​​कि अगर आखिरी ब्लॉक के मूल्यांकन में कोई त्रुटि नहीं थी, तो क्या यह वास्तव में उन लोगों से बेहतर काम करेगा जो मैंने सवाल में लिखा था? सब के बाद, समस्या यह नहीं है कि यह प्रत्येक संदर्भ के लिए कॉल को पुनर्मूल्यांकित करता है (यह एक समस्या भी होगी, और फिर हाँ, कैश समाधान होगा), लेकिन मैं इसे बिल्कुल भी संदर्भित नहीं कर सकता।
टी। वेरॉन

@ T.Verron काइल मेयर सही है। यह परिवर्तन orgmode.org/w/… ने इसे अभी तक ट्रंक में नहीं बनाया है। सबसे नया संस्करण यहाँ है: orgmode.org/w/?p=org-mode.git/a=blob_plain=f=lisp/… । लेकिन, हो सकता है, असंगत परिवर्तन हों ...
टोबियास

@ टी। वीरन एबव से ऊपर मेरा मतलब था "स्थिर रिलीज" और "ट्रंक" नहीं। उसके लिए माफ़ करना। अनुपस्थित सुविधा के लिए आप मेरे उत्तर 1 को वर्कअराउंड के रूप में देख सकते हैं।
तोबियास

3

मुझे संदेह है कि आपको अपने संगठन मोड को अपग्रेड करने की आवश्यकता है। यह मेरे अंत (ऑर्ग का वर्तमान विकास संस्करण) पर काम करता है और सामान्य रूप से टैग के रूप में काम करना चाहिए release_8.3beta। नीचे कमिट किया गया है जो मुझे लगता है कि आपके द्वारा बताई गई समस्या को ठीक करता है।

commit 1877652ce0234cf333fa103b5ada08fbf5946ab1
Date:   Wed Nov 13 11:42:40 2013 -0700

    allow reference to named call lines

    * lisp/ob-ref.el (org-babel-ref-resolve): Look for call lines when
      resolving references.

ऑर्गन को गिट रेपो से लोड करने के अलावा, एक नया संस्करण चलाने के लिए एक और विकल्प ईएलपीए पैकेज स्थापित करना है


ठीक है, मैं विकास संस्करण का उपयोग नहीं है, लेकिन इसका मतलब यह नहीं है कि मैं अद्यतन नहीं किया है 2013 के बाद से मैं नहीं कर रहा हूँ कि देर से। ;)सटीक होने के लिए, मेरा org-version8.2.2 है। मैंने इस जानकारी के साथ प्रश्न को संपादित किया है, जहां इसे पहले स्थान पर होना चाहिए था।
टी। वेरॉन

उफ़, गलत सूचना के बारे में खेद है। यह प्रतिबद्ध होना चाहिए, लेकिन यह 8.2.10 में निहित नहीं है।
काइल मेयर

क्या आपको पता होगा कि मुझे इस कमिटमेंट के बारे में चर्चा कहां मिल सकती है?
टी। वेरॉन

यदि इसके बारे में चर्चा होती है, तो यह ऑर्ग मोड सूची में सबसे अधिक संभावना होगी, लेकिन मुझे खोज करने से एक नहीं मिला, और प्रतिबद्ध संदेश में कोई संदर्भित नहीं है, इसलिए कोई एक नहीं हो सकता है।
काइल मेयर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.