2013-01-14 14 views
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} 

... ...

\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)を実行します。

+0

正確に何を求めているのですか?「可変テーブル/図表キャプション」または「任意のデータセットのループ」が必要ですか?この例では 'mtcars'に制限されていません。 –

+0

ありがとうございます。私は "任意のデータセットのための関数"を望んでいます。これはループを含み、各変数に適切なキャプションを追加します。私はサーベイ研究で働いていますので、それぞれが非常に幅広いデータセットを持っていて、同様の方法で処理する必要のある関連変数のブロックを含んでいます(ヒストグラムとブロック内の各変数の表などを表示します)。私はこれがknitrの頻繁な使用事例だと思いましたか? –

答えて

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} 
+0

あなたは絶対に正しいですが、これが質問に答えるかどうかわかりません –

+0

答えてくれてありがとう、私はそれを考えていませんでしたが、それは本当に質問に答えません。私はちょうど関数を書こうとしています。 myfun = function(someVarsPerhapsWithAttributesForUsingAsCaptions){... produceたとえば、各変数のヒストグラムおよび使用例キャプションとしてのラベルの属性とラテックス、ストーリーの終わりとして実際に印刷する} –

+0

私はあなたがしたいことが本当にわからない私は恐れています。私はあなたの例(と私)があなたに望ましい出力を与えると思って正しいですが、あなたはそれを書く簡単な方法を探していますか? – Backlin

3

私はR関数私見を用いたラテックスのコードを記述しようとしているので、あなたが求めているものを達成するためにwhiskerbrewのような専用のテンプレートライブラリを使用することを好むことは平野醜いです。テンプレートファイルは以下に示され、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} 
+0

これは別の素晴らしいアイデアであり、それも機能します。しかし、私はこれらの提案のいずれかを再利用可能にする、つまりそれを機能に変える方法はまだ分かっていません。 –

+0

あなたが探しているものが明確ではないので、より良い例を投稿できますか?なぜあなたは 'mtcars'データセットを使用せず、あなたが探している出力を記述しますか?私たちは一度それを行うと、より良いお手伝いをすることができます。 – Ramnath

+0

あなたの提案に従い、元の質問に追加しました。あなたの3人が明らかにしたことは、私の問題は実際にループではなく、knitrで使用するための関数を書くことであるということです。ありがとう! –

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))のような行を貼り付けることができます。これにより、専用の機能が不要になります。

関連する問題