我想知道是否有一种简单的方法可以在knitr
中生成带有可变标题的一堆表或图形。我知道的唯一方法是:(从https://github.com/yihui/knitr-examples/blob/master/075-knit-expand.Rnw简化)。但是,将输出收集到src
然后在循环之后打印它是一件很麻烦的事情,因为我想编写一个函数来从任意数据集中产生这样的循环。
\documentclass{article}
\title{Using knit\_expand() for templates}
\author{Yihui Xie}
\begin{document}
\maketitle
\tableofcontents
<<lm-mtcars, tidy.opts=list(width.cutoff=55)>>=
# the template
tpl = c("\\subsection{Regression on {{xvar}}}",
"<<lm-{{xvar}}>>=",
"lm(mpg~{{xvar}}, data=mtcars)",
"@")
# expand to knitr source and pass to knit()
src = lapply(names(mtcars)[-1], function(xvar) {knit_expand(text = tpl)})
@
\Sexpr{knit(text = unlist(src))}
\end{document}
所以我想做的是这样的:
\documentclass{article}
\title{Using knit\_expand() for templates}
\author{Yihui Xie}
\begin{document}
\maketitle
\tableofcontents
<<lm, tidy.opts=list(width.cutoff=55)>>=
myLfFun=function(dataset){
... some function definition which produces say an lm for each variable in dataset ...
}
@
\Sexpr{myLfFun(Titanic}
...
\Sexpr{myLfFun(mtcars}
... etc
\end{document}
...如果我在上面运行brew()会产生...
\documentclass{article}
\title{Brew + knitR}
\author{Ramnath Vaidyanathan}
\begin{document}
\maketitle
\tableofcontents
<<lm-cyl >>=
lm(mpg ~ cyl, data = mtcars)
@
<<lm-disp >>=
lm(mpg ~ disp, data = mtcars)
@
<<lm-hp >>=
lm(mpg ~ hp, data = mtcars)
@
<<lm-drat >>=
lm(mpg ~ drat, data = mtcars)
@
<<lm-wt >>=
lm(mpg ~ wt, data = mtcars)
@
<<lm-qsec >>=
lm(mpg ~ qsec, data = mtcars)
@
<<lm-vs >>=
lm(mpg ~ vs, data = mtcars)
@
<<lm-am >>=
lm(mpg ~ am, data = mtcars)
@
<<lm-gear >>=
lm(mpg ~ gear, data = mtcars)
@
<<lm-carb >>=
lm(mpg ~ carb, data = mtcars)
@
((... same for Titanic database ...))
\end{document}
...,然后我可以输出knit2pdf()的输出。因此,如果该模板名为tmpl.Rnw,我将运行brew('tmpl.Rnw','doc.Rnw'); knit2pdf('doc.Rnw)
最佳答案
我看不出为什么当旧的knit_expand
可以做同样的事情时,为什么需要sprintf
。这是输出:http://www.anst.uu.se/chrba104/stackoverflow/output.pdf。
尽管我的模板也是针对mtcars
数据集定制的,但我看不出如何在不失去灵活性的情况下使其更简单。
\documentclass{article}
\title{Not using knit\_expand() for templates}
\author{Yihui Xie}
\begin{document}
\maketitle
\tableofcontents
<<lm-mtcars, tidy.opts=list(width.cutoff=55)>>=
vars <- setdiff(names(mtcars), 'mpg')
src <- sprintf(
paste('\\subsection{Regression on %s}',
'<<lm-%s>>=',
'lm(mpg ~ %s, data=mtcars)',
'@', sep='\n'),
vars, vars, vars)
@
\Sexpr{knit(text = src)}
\end{document}