2011-11-30 3 views
18

Gdy używam Sweave z R, mogę uniknąć wyraźnego nazwania plików fabuły, po prostu zamykając polecenia wydruku w obrębie fragmentu kodu, takiego jak <<fig=TRUE>> ... @. Kierowca Sweave generuje automatycznie numerowane pliki wydruku jak fig1.pdf, fig2.pdf itpR + Tryb Org: jak uniknąć nazywania plików fabuły?

Jednak w org-mode, wydaje się, że muszę wyraźnie nazwę pliku rysunku używając :file [...].pdf w nagłówku, na przykład

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

Czy istnieje jakiś sposób, aby uniknąć wyraźnie nazywając plik działki i mieć silnik eksport lateksowa org-mode generowania tych plików-nazwiska?

Aktualizacja: jestem w tym roztworze że G. Jay Kerns wskazał tu dla łatwego odniesienia: wszystko co musisz zrobić, to należą temp plik generujący funkcję emacs-LISP w nagłówku, jak :file (org-babel-temp-file "./figure-" ".pdf"). Spowoduje to utworzenie tymczasowego pliku figury w bieżącym katalogu (ze względu na ./). Jeśli chcesz Temp Rysunek plik w globalnym katalogu temp (zdefiniowanego przez zmienną org-babel-temporary-directory), a potem po prostu powiedzieć ".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          

Odpowiedz

5

Wielkie pytanie, a podobna jeden (plus kilka dodatkowych rzeczy) wpadł na Lista mailingowa w trybie Org we wrześniu. Pierwotne pytanie brzmi: here, a szkic możliwego rozwiązania leży w ostatecznej wiadomości z wątku here (patrz # 1, pozostałe elementy dotyczą innych rzeczy).

+0

Dziękuję, to zadziałało pięknie! –

1

Oto kolejny podejście z wykorzystaniem incrementor, jak stosowanie

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

nie wydają się działać dla mnie:

(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) tylko musi być wywoływana raz na sesję do zdefiniuj zmienną; następnie można go usunąć. Działki są zapisywane w pliku default-directory i pojawiają się automatycznie podczas eksportowania pliku .org do .tex przy użyciu (org-latex-export-as-latex).

+1

Wybrana odpowiedź działała wystarczająco dobrze w buforze, ale miałem problemy z eksportowaniem do formatu pdf z powodu plików tymczasowych. Wolę tę odpowiedź, ponieważ działa ona na eksport pdf i zapisuje dane w katalogu roboczym. – Tedward

0

Zrobiłem poniżej funkcję seplenienia. Ta funkcja ma 2 argumenty DIRNAME i FNAME "fname". Ta funkcja generuje ścieżkę DIRNAME/FNAME ##. Png, gdzie ## jest numerem kolejnym w katalogu. Na przykład, jeśli są fig1.png, fig2.png, fig4.png i podajesz fig jako FNAME, ta funkcja zwraca fig3.png (brakujący numer). Jeśli są fig1.png rys.2.png rys ..png, to zwraca fig4.png. Jeśli nie ma plików, to zwraca 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"))))