2011-11-30 85 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"))))