knitr

2013-01-14 28 views
5

knitr değişken başlıklarla tablo veya grafik bir demet üretmek için kolay bir yol olup olmadığını merak ediyorum ile Altyazılı döngüye sokar. Bildiğim tek yolu şudur: (https://github.com/yihui/knitr-examples/blob/master/075-knit-expand.Rnw'dan basitleştirilmiş). Ancak, çıktıyı src içine almak için bir sürükle ve sonra döngüden sonra yazdır, çünkü rasgele bir veri kümesinden böyle bir döngü oluşturmak için bir işlev yazmak istiyorum.knitr

\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} 

yüzden yerine yapabilmek istediğini böyle bir şeydir: ...

\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} 

... Ben demlemek kaçsam() yaratabileceği üzerinde

\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} 

... ve bu çıkışı yapabilirdim sonra knit2pdf(). Eğer şablon tmpl.Rnw olarak adlandırılırsa, brew ('tmpl.Rnw', 'doc.Rnw') çalıştırırdım; knit2pdf ('doc.Rnw)

+0

Tam olarak ne soruyorsunuz anlamadım - "değişken tablo/şekil başlıkları" veya "isteğe bağlı veri kümesi için bir döngü" ister misiniz? Bu örnekte 'mtcars' ile sınırlı değilsiniz. –

+0

Teşekkürler. Bir döngü içerecek ve her değişken için uygun altyazı ekleyecek olan "keyfi bir veri kümesi için bir işlev" istiyorum. Anket araştırmasında çalışıyorum. Bu nedenle, her biri benzer şekillerde işlenmesi gereken ilgili değişken bloklarını içeren çok geniş veri setlerine sahibim (bloktaki her değişken için histogram ve tabloları gösterme, vb.). Bunun Knitr için sık kullanılan bir durum olduğunu düşündüm? –

cevap

3

Niçin iyi olduğunuzu anlamıyorum knit_expand Eski sprintf aynı şeyi yapabilir. İşte çıktı: http://www.anst.uu.se/chrba104/stackoverflow/output.pdf.

Şablonum ayrıca mtcars veri kümesi için özel olarak yapılmış olsa da, esnekliği kaybetmeden nasıl daha basit hale getirebileceğinizi göremiyorum.

\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

kesinlikle haklısınız, ama bu sorunun cevabını bilmiyorum –

+0

Cevabınız için teşekkürler, bunu düşünmemiştim, ama hayır, gerçekten soruya cevap vermiyor. Sadece {bir işlev myfun = function (someVarsPerhapsWithAttributesForUsingAsCaptions) yazmak istiyorum ... mesela üretmek her varyantın bir histogramı ve örn. Bir altyazı olarak etiket özniteliği ve aslında onu lateks, öykünün sonu olarak yazdı} –

+0

Gerçekten ne yapmak istediğinizi görmüyorum korkuyorum. Örneğinizin (ve benimki) istenen çıktıyı vereceğini düşünerek düzeliyorum, fakat bunu yazmanın daha basit bir yolunu mu arıyorsunuz? – Backlin

3

Ben bir R fonksiyonu IMHO kullanarak lateks kod yazmaya çalışıyorum çünkü ne arıyorlar ulaşmak için whisker ve brew gibi özel şablon kütüphaneleri kullanmayı tercih düz çirkin. Şablon dosyası aşağıda gösterilmiştir ve tpl.Rnw olarak adlandırılmıştır. Aşağıdaki komutları çalıştırarak pdf'ye dönüştürebilirsiniz. Knitr kullanarak demleme şablonlarını pdf'ye dönüştüren bu mantığı içine alan bir işlevi kolayca yazabilirsiniz.

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

Şablon Dosyası 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

başka harika bir fikir ve aynı zamanda işe yarıyor. Ama yine de bu önerilerin herhangi birini yeniden kullanılabilir hale getirmeyi, yani bir işleve dönüştürmeyi bilmiyorum. –

+0

Daha iyi bir örnek yayınlayabilir misiniz, tam olarak ne aradığınızı net olarak göremiyorum. Neden mtcars veri kümesini kullanmıyorsunuz ve aradığınız çıktıyı açıklamıyorsunuz. Bunu yaptıktan sonra size daha iyi yardımcı olacağız. – Ramnath

+0

Önerinizi takip ettim ve orijinal soruya ekledim. Üçünüzün açıklığa kavuşturulmasında bana yardımcı olan şey, sorunumun gerçekten döngüde olmaması, knitr ile kullanım için yazma işlevlerinin olmasıdır. Teşekkürler! –

0

Ben önceki normal kod yığın içine \Sexpr{knit(text = unlist(src))} çizgi koymak yüzden gelemedi öğrendim. Dokümanın başlangıcında opts_knit$set(progress = F, verbose = F)'u ayarladım ve yığın için en azından comment=NA, warning=FALSE,message=FALSE,echo=FALSE'u ayarlamam gerekiyordu. Bu basit hareket, istediğim her yerde ve bir kerede bir yığın halinde istediğim gibi knit(text = unlist(src)) gibi satırları yapıştırır. Bu, özel bir işleve olan ihtiyacı ortadan kaldırır.