2013-03-27 8 views
5

私はknitrを使ってレポートを生成しています。しかし、私は多くの場合、最初にすべてのプロットを含む「内部」文書を作成し、最終的なレポートや論文の一部にのみ含めるようにします。 1とナンバリングしながらなど、`fig.keep = 'all'`を使って`ニット'するときの図形名の指定方法

<<sample, fig.keep = 'all'>>= 
specimen <- c("436a", "783a", "10b") 
for (s in specimen) # in reality it would e.g. be levels (specimen) 
    plot (results [s]) 
@ 

これは、ファイルfigures/sample1.pdffigures/sample2.pdfの数を生成します 、2:

言ってやるが、私は、体系的生産フィギュアのセットを持って、私は私の標本をループ言います、...ニットで作成されたレポートには適しています。紙にプロットの1つを含めるには、厄介でエラーが発生して、どのPDFファイルがどのサンプルに属しているかを知ることができます。

"figures/sample-436a.pdf"のようなファイル名をknitrに使用するにはどうすればよいですか?

私は<<fig.path = sprintf ("figures/sample-%s", s)>>=を試してみましたが、それは動作しません:sは不明ですので、私はチャンクを保存するときfig.pathは、右のチャンク処理の先頭でない評価されると思います。

PS:エラーのリスクを軽減するための1つの明らかな方法はタイトルですが、これは論文では醜いです。

+0

誤解されるかもしれませんが、あなたの背景と同じ色でタイトルを印刷できますか?白、それらを見えないようにして、デバッグに利用できるようにしますか? – PatrickT

+0

@PatrickT:デバッグ用ではありません。プレゼンテーションや長いペーパーのためにそのようなシリーズの権利を選ぶために。また、目に見えないタイトルはそれを助けません。ファイルマネージャのアイコンで読むことができれば、目に見えるタイトルが役立ちます。 – cbeleites

+0

私は、おかげでcbeleitesを参照してください。 – PatrickT

答えて

5

良い質問です。これは満足のいく答えかもしれないかどうかわからない:あなたのケースでは

\documentclass{article} 

\begin{document} 

<<prepare-src, include=FALSE>>= 
s = names(iris)[-5] 
# construct the source document 
src = sprintf('<<sample-%s>>= 
hist(iris[,"%s"], col="gray", border="white") 
@', s, s) 
@ 

% evaluate the source 
\Sexpr{knit(text = src)} 

\end{document} 

、あなただけのsに入るためにどの標本を決定する必要があります。

+0

ありがとう、Yihui。私はもっ​​とエレガントなことを望んでいたことは認めていますが、少なくとも私の個人的なものにはこれを使用します。そのようなファイルを送っても私の協力者はおそらく怒ってしまうでしょうし、彼らに 'knitr' /' Sweave'に切り替えることはできません。 – cbeleites

+1

キーの難しさはアニメーションです。私はfig1、fig2、...を使用しなければなりません。そうしないと、あなた自身の方法でFigureファイルの名前を付けることが可能になります。これについてもっと考えてみましょう。 –

3

フックを使用して同じことを達成する別の方法です(少し複雑ですが)。 2つのフック、チャンクオプションfig.namesに基づいて数字の名前を変更するチャンクフック、およびドキュメント内の名前を置き換える出力フックを使用します。私はこのコードをリファクタリングすることができると確信しています、またはそれがasisで動作するようにknitrに挿入さえできます。

\documentclass{article} 
\begin{document} 

<<main, echo = F>>= 
knit_hooks$set(fig.names = function(before, options, envir){ 
    if (!before) { 
    from = dir('figure', pattern = opts_current$get('label'), full = TRUE) 
    to = sprintf('%s.pdf', file.path('figure', 
     paste(opts_current$get('label'), options$fig.names, sep = "-"))) 
    file.rename(from, to) 
    } 
}) 
knit_hooks$set(chunk = function(x, options){ 
    if (is.null(options$fig.names)){ 
    knitr:::.chunk.hook.tex(x, options) 
    } else { 
    chunk_name = opts_current$get('label') 
    x = gsub(sprintf('%s[0-9]', chunk_name), 
     sprintf("%s-%s", chunk_name, options$fig.names), x) 
    knitr:::.chunk.hook.tex(x, options) 
    } 
}); 
@ 


<<iris, fig.names = letters[1:4]>>= 
invisible(lapply(iris[,-5], hist, col = 'gray', border = 'white')) 
@ 

\end{document} 
+0

Ramnathに感謝、私はこの基礎から自分のフックを構築します。完全に機能させるには、いくつかの詳細が必要です。 1) '〜'は、番号が付けられたファイルだけをキャプチャする必要があります(名前が変更されたファイルが存在すると、現在のバージョンは失敗します)。 a) 'to 'は適切にソートされる必要があります(10> 9)。また、' \ includegraphics'出力にはさらに注意が必要です。現在、 'iris-a'が4回含まれています。 – cbeleites

関連する問題