2011-11-30 16 views
18

जब मैं SweaveR के साथ उपयोग करता हूं, तो मैं <<fig=TRUE>> ... @ जैसे कोड-खंड के भीतर प्लॉट कमांड को बस संलग्न करके प्लॉट फ़ाइलों को स्पष्ट रूप से नामित करने से बच सकता हूं। Sweave ड्राइवर स्वचालित रूप से, fig1.pdf, fig2.pdf तरह साजिश फ़ाइलें गिने आदिआर + संगठन मोड: साजिश फाइलों का नामकरण से कैसे बचें?

हालांकि org-mode में, ऐसा लगता है जैसे मैं स्पष्ट रूप से शीर्ष लेख में एक :file [...].pdf का उपयोग कर आंकड़ा फ़ाइल, जैसे नाम के लिए की जरूरत है उत्पन्न

#+attr_latex: width=8cm placement=[htbp] 
#+begin_src R :results output graphics :exports results :file fig.pdf                                                 
    require(ggplot2)                               
    a <- rnorm(100)                                
    b <- 2*a + rnorm(100)                              
    d <- data.frame(a,b)                              
    ggplot(d,aes(a,b)) + geom_point()                           
#+end_src          

वहाँ किसी तरह स्पष्ट रूप से साजिश फ़ाइल नामकरण से बचने, और ऑर्ग मोड लेटेक्स निर्यात इंजन इन फ़ाइल नाम उत्पन्न करने के लिए है?

अपडेट: तुम सब करने की जरूरत है एक अस्थायी-फ़ाइल-पैदा शीर्षक में Emacs-तुतलाना समारोह, :file (org-babel-temp-file "./figure-" ".pdf") की तरह शामिल है: मैं समाधान है कि जी जे Kerns आसान संदर्भ के लिए यहां की ओर इशारा शामिल कर रहा हूँ। यह वर्तमान निर्देशिका में एक अस्थायी चित्र फ़ाइल बनाता है (./ की वजह से)। आप एक वैश्विक अस्थायी निर्देशिका (चर org-babel-temporary-directory द्वारा परिभाषित) में अस्थायी आंकड़ा फ़ाइल चाहते हैं, तो बस ".figure" कहते हैं:

#+attr_latex: width=8cm placement=[htbp] 
#+begin_src R :results output graphics :exports results :file (org-babel-temp-file "./figure-" ".pdf")                                                 
    require(ggplot2)                               
    a <- rnorm(100)                                
    b <- 2*a + rnorm(100)                              
    d <- data.frame(a,b)                              
    ggplot(d,aes(a,b)) + geom_point()                           
#+end_src          

उत्तर

5

महान सवाल है, और इसी तरह की एक (प्लस कुछ अतिरिक्त सामान) पर आया सितंबर में ऑर्ग-मोड मेलिंग सूची वापस। मूल प्रश्न here है, और संभव समाधान का एक स्केच here के अंतिम संदेश में है (देखें # 1, अन्य आइटम अन्य चीजों के बारे में हैं)।

+0

धन्यवाद, यह खूबसूरती से काम करता है! –

1

यहाँ एक incrementor का उपयोग कर एक और दृष्टिकोण, मेरे लिए काम करने के लिए

(org-babel-temp-file "./figure-" ".pdf")

के उपयोग

नहीं मालूम था के रूप में:

(setq i 0) 
#+begin_src R :file (concat "f" (number-to-string (incf i)) ".pdf") :results output graphics :exports results 
(plot (rnorm(10)) 
#+end_src 

(setq i) केवल एक बार प्रति सत्र कॉल किया जाना चाहिए चर परिभाषित करें; इसे मिटाया जा सकता है। प्लॉट्स को आपके default-directory पर सहेजा गया है और फ़ाइल को .tex पर (org-latex-export-as-latex) का उपयोग करते समय स्वचालित रूप से दिखाई देते हैं।

+1

चयनित उत्तर बफर के भीतर काफी अच्छा काम करता था, लेकिन मुझे temp फ़ाइलों की वजह से पीडीएफ को निर्यात करने में समस्याएं थीं। मैं यह जवाब पसंद करता हूं क्योंकि यह पीडीएफ निर्यात के लिए काम करता है और कामकाजी निर्देशिका में आंकड़े बचाता है। – Tedward

0

मैंने नीचे एक लिस्प फ़ंक्शन बनाया है। इस फ़ंक्शन में 2 तर्क DIRNAME और FNAME "fname" हैं। यह फ़ंक्शन पथ DIRNAME/FNAME ##। Png, उत्पन्न करता है जहां ## निर्देशिका में अनुक्रमिक संख्या है। उदाहरण के लिए, अगर fig1.png fig2.png fig4.png और हैं तो आप अंजीर को FNAME के ​​रूप में देते हैं, यह फ़ंक्शन fig3.png (अनुपलब्ध संख्या) देता है। अगर वहाँ fig1.png fig2.png fig3.png हैं, यह fig4.png देता है। यदि कोई फाइल नहीं है, तो यह fig1.png देता है।

(defun search-file-name (dirname fname) 
    "This function generates a path DIRNAME/FNAME##.png, 
    where ## is a sequencial number in the directory. 
    For example, if there are fig1.png fig2.png fig4.png and 
    you give fig as FNAME, this function returns fig3.png(missing number). 
    If there are fig1.png fig2.png fig3.png, this returns fig4.png. 
    If there are no files, this returns fig1.png." 

    (setq string (directory-files dirname nil (concat fname "[0-9]+\\.png") t)) 
    (if (not string) (concat dirname fname "1.png") 
    (progn 
     (setq number-list 
      (mapcar '(lambda (x) 
         (string-match (concat fname "\\([0-9]+\\)\\.png") x) 
         (match-string 1 x)) 
        string)) 
     (setq w1 (sort (mapcar 'parse-integer number-list) '<)) 

     (setq missing nil) 
     (loop for j from 1 to (length w1) do 
      (if (not (equal j (elt w1 (- j 1)))) 
       (progn (setq missing j) (return missing)))) 
     (if (not missing) (setq missing (+ 1 (car (last w1))))) 
     (concat dirname fname (number-to-string missing) ".png")))) 

    (setq missing nil) 
    (loop for j from 1 to (length w1) do 
     (if (not (equal j (elt w1 (- j 1)))) 
      (progn (setq missing j) (return missing)))) 
    (if (not missing) (setq missing (+ 1 (car (last w1))))) 
    (concat dirname fname (number-to-string missing) ".png")))) 
संबंधित मुद्दे