2011-11-30 27 views
18

Cuando uso Sweave con R, puedo evitar nombrar explícitamente los archivos de trazado simplemente encerrando los comandos de trazado dentro de un fragmento de código como <<fig=TRUE>> ... @. El conductor Sweave genera automáticamente archivos de trazado numerada como fig1.pdf, fig2.pdf, etc.Modo R + Org: ¿cómo evitar nombrar archivos de trazado?

Sin embargo, en org-mode, parece que tengo que indicar el nombre de archivo de la figura usando un :file [...].pdf en la cabecera, por ejemplo,

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

¿Hay alguna manera de evitar de manera explícita el nombre del archivo trama, y ​​haga que el motor de exportación de látex-org modo de generar estos nombres de archivo?

Actualización: Estoy incluyendo la solución que G. Jay Kerns señaló aquí para una fácil referencia: todo lo que necesita hacer es incluir una temp-file-generación de la función Emacs Lisp en la cabecera, como :file (org-babel-temp-file "./figure-" ".pdf"). Esto crea un archivo de figura temporal en el directorio actual (debido al ./). Si desea que la figura de archivo temporal en un directorio temporal mundial (definida por la variable org-babel-temporary-directory), a continuación, sólo decir ".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          

Respuesta

5

Muy buena pregunta, y otro similar (más algo de material extra) subieron sobre la Lista de correo del modo Org en septiembre. La pregunta original es here, y un boceto de una posible solución se encuentra en el mensaje final del subproceso here (consulte el n. ° 1, los demás elementos son sobre otras cosas).

+0

¡Gracias, funcionó muy bien! –

1

Aquí hay otro método que utiliza un incrementador, como el uso de

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

no parecía

a trabajar para 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) solo necesita ser llamada una vez por sesión de definir la variable; luego puede ser borrado. Los gráficos se guardan en su default-directory y aparecen automáticamente al exportar el archivo .org al .tex usando (org-latex-export-as-latex).

+1

La respuesta seleccionada funcionó bastante bien dentro del búfer, pero tuve problemas al exportar a pdf debido a los archivos temporales. Prefiero esta respuesta porque funciona para la exportación de PDF y guarda cifras en el directorio de trabajo. – Tedward

0

He hecho una función de lisp a continuación. Esta función tiene 2 argumentos DIRNAME y FNAME "fname". Esta función genera una ruta DIRNAME/FNAME ##. Png, donde ## es un número secuencial en el directorio. Por ejemplo, si hay fig1.png fig2.png fig4.png y asigna higo como FNAME, esta función devuelve fig3.png (número faltante). Si hay fig1.png fig2.png fig3.png, esto devuelve fig4.png. Si no hay archivos, esto devuelve 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")))) 
Cuestiones relacionadas