2011-11-30 22 views
18

Sweave'u R ile kullandığımda, arsa dosyalarının yalnızca <<fig=TRUE>> ... @ gibi bir kod-yığınındaki plot komutlarını içerecek şekilde adlandırılmasını açıkça önleyebilirim. Sweave sürücü otomatik fig1.pdf, fig2.pdf gibi arsa dosyaları numaralı oluşturur açıkça başlığındaki :file [...].pdf kullanarak figür dosyasını, örneğin isim gerekiyor gibi vbR + Org modu: adlandırma dosyalarını adlandırma nasıl engellenir?

Ancak org-mode yılında, öyle görünüyor

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

arsa dosyasına isim açıkça önlemek ve org-mod lateks ihracat motoru bu dosya adları oluşturmak için bir yol var mı?

Güncelleme: yapmanız gereken tüm geçici dosyası üreten başlığındaki emacs-lisp fonksiyonu, :file (org-babel-temp-file "./figure-" ".pdf") gibi include: Ben G. Jay Kerns kolay başvuru için Buraya işaret çözümü dahil ediyorum. Bu geçerli dizinde geçici bir şekil dosyası oluşturur (./ yüzünden). Eğer (değişken org-babel-temporary-directory tarafından tanımlanan) bir genel geçici dizinde geçici figür dosyasını isterseniz, o zaman sadece ".figure" ki:

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

cevap

5

Güzel soru ve benzer bir (artı bazı ekstra şeyler) üzerinde geldi Org modu posta listesi Eylül ayında. Özgün soru here ve olası bir çözümün bir taslağı here iş parçacığının son iletisinde yer alır (bkz. # 1, diğer öğeler başka şeylerle ilgilidir).

+0

Teşekkür ederim, bu çok güzel çalıştı! –

1

İşte benim için çalışmak

görünmüyordu

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

kullanımı gibi, bir artım kullanarak başka bir yaklaşım:

(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) sadece bir kez oturum başına çağrılması gerekir değişkeni tanımlamak; daha sonra silinebilir. Arsalar default-directory numaranıza kaydedilir ve .org dosyasını .tex(org-latex-export-as-latex) kullanarak dışa aktarırken otomatik olarak görünür.

+1

Seçilen yanıt, arabellek içinde yeterince iyi çalıştı, ancak geçici dosyalar nedeniyle pdf'ye dışa aktarma sorunları yaşadım. Bu cevabı tercih ediyorum çünkü pdf ihracat için çalışıyor ve çalışma dizinindeki rakamları kaydediyor. – Tedward

0

Aşağıda bir lisp işlevi yaptım. Bu işlevde 2 argüman DIRNAME ve FNAME "fname" vardır. Bu işlev, DIRNAME/FNAME ##. Png, yolunu oluşturur; burada #, dizinde bir sıralı sayıdır. Örneğin, fig1.png fig2.png fig4.png ve varsa, FNAME olarak şekil verirsiniz, bu işlev fig3.png (eksik sayı) değerini döndürür. Eğer fig1.png fig2.png fig3.png varsa, fig4.png değerini döndürür. Dosya yoksa, fig1.png değerini döndürür.

(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"))))