2011-11-30 62 views
18

當我使用SweaveR時,我可以避免明確命名繪圖文件,只需將繪圖命令封裝在代碼塊中,如<<fig=TRUE>> ... @。該Sweave驅動程序自動生成編號的打印文件一樣fig1.pdffig2.pdfR +組織模式:如何避免命名劇情文件?

然而,在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          

是否有某種方式來避免明確命名的繪圖文件,並具備組織模式乳膠出口引擎生成這些文件的名稱?

更新:我包括G.周杰倫克恩斯指出,這裏簡單的參考解決方案:所有你需要做的是包括一個臨時文件產生的報頭的Emacs Lisp函數,如:file (org-babel-temp-file "./figure-" ".pdf")。這將在當前目錄中創建一個臨時圖形文件(因爲./)。如果你想在一個全球性的臨時目錄(由變量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

下面是用增量器的另一種方法,如使用

(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,並在使用(org-latex-export-as-latex).org文件導出爲.tex時自動顯示。

+1

所選答案在緩衝區內工作得不錯,但由於臨時文件導致pdf導出問題。我更喜歡這個答案,因爲它適用於PDF導出並將數字保存在工作目錄中。 – Tedward

0

我在下面做了一個lisp函數。 該函數有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"))))