R + Org-режим: как избежать именования файлов сюжета? - PullRequest
19 голосов
/ 30 ноября 2011

Когда я использую Sweave с R, я могу избежать явного присвоения имен файлам графика, просто заключая команды графика в кусок кода, такой как <<fig=TRUE>> ... @. Драйвер Sweave автоматически генерирует пронумерованные файлы, такие как fig1.pdf, fig2.pdf и т. Д.

Однако в 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                                     

Есть ли какой-нибудь способ избежать явного присвоения имени файлу графика и заставить механизм экспорта латекса в режиме org генерировать эти имена файлов?

Обновление: Я включаю решение, на которое Дж. Кернс указал здесь для удобства: все, что вам нужно сделать, это включить функцию 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                                     

Ответы [ 3 ]

7 голосов
/ 01 декабря 2011

Отличный вопрос, и аналогичный вопрос (плюс некоторые дополнительные материалы) появился в списке рассылки в режиме Org еще в сентябре. Первоначальный вопрос здесь , а набросок возможного решения заключается в окончательном сообщении темы здесь (см. # 1, остальные пункты о других вещах).

2 голосов
/ 17 марта 2015

Вот еще один подход, использующий инкрементор, например

.

(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 в .tex с использованием (org-latex-export-as-latex).

0 голосов
/ 11 июня 2016

Я сделал функцию LISP ниже. Эта функция имеет 2 аргумента DIRNAME и FNAME "fname". Эта функция генерирует путь DIRNAME / FNAME ##. Png, где ## - порядковый номер в каталоге. Например, если есть fig1.png fig2.png fig4.png и Вы задаете fig как 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"))))
...