2011-11-30 5 views
18

Sweaveを使用すると、plotコマンドを<<fig=TRUE>> ... @のようなコードチャンクに囲むだけで、プロットファイルの名前を明示的に指定することを避けることができます。 Sweaveドライバが自動的にorg-modeにしかしなどfig1.pdfなどの番号が付けプロットファイル、fig2.pdfR + 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-モードラテックスエクスポートエンジンは、これらのファイル名を生成持っているいくつかの方法はありますか?

アップデート:すべてを行う必要がある:file (org-babel-temp-file "./figure-" ".pdf")のように、ヘッダに一時ファイル生成のemacs-lispの機能が含まれている:。私はG.ジェイ・カーンズが簡単に参照のためにここまで指摘ソリューションを含めていますこれにより、現在のディレクトリにtemp figure-fileが作成されます(./のため)。あなたは(変数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          

答えて

5

グレート質問、および同様のもの(プラスいくつかの余分なもの)が上に来ました9月の組織モードのメーリングリスト。元の質問はhereであり、可能な解決策のスケッチはスレッドhereの最後のメッセージにあります(#1を見てください、他の項目は他のものについてです)。

+0

ありがとう、それは美しく働いた! –

1

ここ

(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)を使用します。

+1

選択した回答がバッファ内で十分に機能しましたが、一時ファイルのためにpdfにエクスポートする際に問題が発生しました。私はpdfのエクスポートのために働くので、この答えを好むし、作業ディレクトリの数値を保存します。 – Tedward

0

私は以下のようなlisp関数を作成しました。 この関数には、DIRNAMEとFNAME "fname"という2つの引数があります。 この関数は、ディレクトリDIRNAME/FNAME ##。png、 を生成します。##はディレクトリ内のシーケンシャル番号です。 たとえば、fig1.png fig2.png fig4.pngと がある場合、FNAMEとしてfigを指定すると、この関数は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")))) 
関連する問題