我正在使用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,...对编织生成的报告有好处,但如果我想在文章中包含其中一个图表,则很麻烦,并且容易发现哪个.pdf属于哪个样本。
如何告诉knitr
使用"figures/sample-436a.pdf"
等文件名?
我尝试了<<fig.path = sprintf ("figures/sample-%s", s)>>=
,但这不起作用:s
未知,所以我猜fig.path
是在块处理开始时评估的,而不是在保存块时
答案 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}