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

...這,如果我跑了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)

+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){...例如產生每個var的直方圖並使用例如標籤屬性作爲標題,並實際上將其作爲乳膠打印,故事結束} –

+0

我真的不知道你想做什麼我害怕。我是否認爲你的例子(和我)給你想要的輸出是正確的,但是你正在尋找一種更簡單的方式來寫它? – Backlin

3

我更喜歡使用專用的模板庫,例如whiskerbrew實現你正在尋找的東西,因爲嘗試使用R功能恕我直言寫乳膠代碼是難看。模板文件如下所示,並命名爲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

我遵循你的建議,並添加到原來的問題。你們三位幫助我澄清的是,我的問題並不是真正的循環,而是寫作功能與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))這樣的行,並且可以多次在大塊中粘貼。這消除了對專用功能的需要。