5

knitrレポートを生成するために使用しています。しかし、私は最初にすべてのプロットを含む「内部」文書を作成し、次に最終レポートまたは論文のために図の一部のみを含めたいと思うことがよくあります。

たとえば、体系的に作成された一連の図があるとします。標本をループするとします。

<<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.pdfこれにより、多数のファイルがfigures/sample2.pdf生成されます。1、2、... の番号付けは、knitr が生成するレポートには適していますが、プロットの 1 つを紙に含めたい場合、面倒でエラーが発生しやすくなります。どの .pdf がどのサンプルに属しているかを調べます。

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

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

PS: エラーのリスクを軽減する明白な方法の 1 つはタイトルですが、それは私見では紙面では見苦しいものです。

4

2 に答える 2

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

于 2013-03-27T19:09:57.523 に答える
3

フックを使用して同じことを実現する別の方法 (少し複雑ではありますが) を次に示します。チャンク オプションに基づいて図の名前を変更するチャンク フックとfig.names、ドキュメント内の名前を置き換える出力フックの 2 つのフックを使用します。このコードをリファクタリングしたり、挿入してそのまま機能させることができると確信しています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}
于 2013-03-27T23:13:36.550 に答える