Подтвердить что ты не робот

R + Org-mode: как избежать именования файлов сюжета?

Когда я использую 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-mode для этих имен файлов?

Обновление: Я включаю в себя решение, которое Дж. Кернс указал здесь для удобства: все, что вам нужно сделать, это включить функцию emacs- lisp, создающую temp файл заголовок, например :file (org-babel-temp-file "./figure-" ".pdf"). Это создает temp figure-file в текущем каталоге (из-за ./). Если вам нужен файл temp figure в глобальном каталоге temp (определяемый переменной 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                                     
4b9b3361

Ответ 1

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

Ответ 2

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

(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).

Ответ 3

Я сделал функцию 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"))))