2011-11-30 18 views
18

Khi tôi sử dụng Sweave với R, tôi có thể tránh đặt tên rõ ràng các tệp lô bằng cách chỉ cần đặt các lệnh lô trong một đoạn mã như <<fig=TRUE>> ... @. Người tài xế Sweave tự động tạo ra file được đánh số âm mưu như fig1.pdf, fig2.pdf vvR + Org-mode: làm thế nào để tránh đặt tên các tệp lô?

Tuy nhiên trong org-mode, nó có vẻ như tôi cần phải đặt tên một cách rõ ràng các tập tin hình sử dụng một :file [...].pdf trong tiêu đề, ví dụ

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

Có cách nào để tránh đặt tên rõ ràng tệp lô và công cụ xuất cao su chế độ org tạo ra các tên tệp này không?

Cập nhật: tôi bao gồm các giải pháp mà G. Jay Kerns chỉ đến đây để tham khảo dễ dàng: tất cả các bạn cần làm là bao gồm một temp-file-tạo chức năng emacs-lisp trong tiêu đề, như :file (org-babel-temp-file "./figure-" ".pdf"). Điều này tạo ra một tệp hình tạm thời trong thư mục hiện tại (vì ./). Nếu bạn muốn tạm con số-file trong một thư mục tạm thời toàn cầu (được định nghĩa bởi biến org-babel-temporary-directory), sau đó chỉ cần nói ".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          

Trả lời

5

Great câu hỏi, và một tương tự (cộng với một số công cụ bổ sung) đã đưa ra trên Danh sách gửi thư chế độ tổ chức lại vào tháng 9. Câu hỏi ban đầu là here, và một phác thảo của một giải pháp có thể nằm trong thông điệp cuối cùng của luồng here (xem # 1, các mục khác là về những thứ khác).

+0

Cảm ơn bạn, đã hoạt động rất tốt! –

1

Đây là một cách tiếp cận sử dụng một incrementor, như việc sử dụng các

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

dường như không làm việc cho tôi:

(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) chỉ cần được gọi là một lần mỗi phiên tới xác định biến; sau đó nó có thể bị xóa. Các ô được lưu vào default-directory và tự động xuất hiện khi xuất tệp .org sang .tex bằng cách sử dụng (org-latex-export-as-latex).

+1

Câu trả lời được chọn làm việc đủ tốt trong bộ đệm, nhưng tôi đã gặp vấn đề khi xuất sang pdf vì các tệp tạm thời. Tôi thích câu trả lời này bởi vì nó hoạt động cho việc xuất pdf và lưu các số liệu trong thư mục làm việc. – Tedward

0

Tôi đã thực hiện chức năng lisp bên dưới. Chức năng này có 2 đối số DIRNAME và FNAME "fname". Chức năng này tạo ra một đường dẫn DIRNAME/FNAME ##. Png, trong đó ## là số thứ tự trong thư mục. Ví dụ: nếu có fig1.png fig2.png fig4.png và bạn cho hình là FNAME, hàm này trả về fig3.png (số bị thiếu). Nếu có fig1.png fig2.png fig3.png, điều này trả về fig4.png. Nếu không có tệp nào, điều này trả về 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")))) 
Các vấn đề liên quan