5

で可変キャプションを使用して一連のテーブルまたはグラフィックを作成する簡単な方法があるかどうか疑問に思っています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)を実行します。

4

3 に答える 3

3

R関数IMHOを使用してラテックスコードを記述しようとするのは明らかに醜いので、私はあなたが求めているものを達成するためにwhisker専用のテンプレートライブラリを使用することを好みます。brewテンプレート ファイルは次のとおりで、名前はtpl.Rnw. 次のコマンドを実行すると、pdf に変換できます。Knitr を使用して、brew テンプレートを pdf に変換するこのロジックをカプセル化する関数を簡単に作成できます。

brew('tpl.Rnw', 'doc.Rnw') 
knit2pdf('doc.Rnw')        

テンプレートファイルtpl.Rnw

\documentclass{article}
\title{Brew + knitR}
\author{Ramnath Vaidyanathan}
\begin{document}

\maketitle
\tableofcontents


<% for (xvar in names(mtcars)[-1]) { %>

\subsection{Regression on <%= xvar %>}

<<lm-<%= xvar %> >>=
lm(mpg ~ <%= xvar %>, data = mtcars)
@

<% } %>

\end{document}
于 2013-01-15T16:31:45.730 に答える
3

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}
于 2013-01-14T11:10:13.207 に答える
0

\Sexpr{knit(text = unlist(src))}以前の通常のコードチャンク内に行を配置できなかった理由がわかりました。ドキュメントの最初に設定し、チャンクopts_knit$set(progress = F, verbose = F)の少なくとも一部を設定する必要がありました。comment=NA, warning=FALSE,message=FALSE,echo=FALSEこの単純な移動により、必要なknit(text = unlist(src))場所に何度でもチャンクに行を貼り付けることができます。これにより、専用の機能が不要になります。

于 2013-01-30T19:49:16.220 に答える