使用`fig.keep ='all'`编织时如何指定图名

时间:2013-03-27 12:50:55

标签: r knitr

我正在使用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.pdffigures/sample2.pdf等。 虽然编号为1,2,...对编织生成的报告有好处,但如果我想在文章中包含其中一个图表,则很麻烦,并且容易发现哪个.pdf属于哪个样本。

如何告诉knitr使用"figures/sample-436a.pdf"等文件名?

我尝试了<<fig.path = sprintf ("figures/sample-%s", s)>>=,但这不起作用:s未知,所以我猜fig.path是在块处理开始时评估的,而不是在保存块时

PS:降低错误风险的一个显而易见的方法是标题,但这在一篇论文中是恕我直言。

2 个答案:

答案 0 :(得分: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的样本。

答案 1 :(得分:3)

这是使用钩子实现相同的另一种方式(尽管有点复杂)。我们使用两个钩子,一个根据块选项fig.names重命名数字的块钩子,以及一个替换文档中名称的输出钩子。我确信此代码可以重构,甚至插入knitr以使其工作asis。

\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}