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.pdffigures/sample2.pdf等等。虽然编号为 1、2、... 对 knitr 生成的报告有好处,但如果我想在论文中包含其中一个图,则很麻烦且容易出错找出哪个 .pdf 属于哪个样本。

我怎么知道knitr使用文件名,例如"figures/sample-436a.pdf"

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

PS:减少错误风险的一个明显方法是标题,但恕我直言,这在论文中很难看。

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,以及一个替换文档中名称的输出钩子。我确信可以重构此代码,甚至可以将其插入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 回答