2012-02-02 45 views
3

是否可以通過Sweave生成一個LaTeX文檔,該文檔沒有預定義其元素的數量?我的意思是,假設我需要爲數據框中的每一行建立一個表格。文檔中的表格數量將取決於數據框中的行數。動態Sweave文檔

換言之,在for循環內生成LaTeX元素。 Sweave會爲每一行建立一個表格。

這同樣適用於頁面或其他元素。是否有可能做到這一點?

+1

使用'brew'中描述了一種很好的教程[本博客](http://learnr.wordpress.com/2009/09/09/brew-creating-repetitive-reports/) – baptiste 2012-02-02 20:20:05

+0

是的,我相信在我的情況下,最好的方法是使用brew來生成tex文件。這樣我可以使用if,if和其他控制結構來動態生成tex文件。 – 2012-02-09 11:45:30

回答

2

這是否幫助:

\documentclass[a4paper,12pt]{article} 
\usepackage{Sweave} 

\begin{document} 

<<echo=FALSE>>= 
library(xtable) 
df <- structure(list(ID = 2:6, home_pc = structure(c(2L, 6L, 1L, 3L, 
5L), .Label = c("BY5 8IB", "CB4 2DT", "DH4 6PB", "KN4 5GH", "MP9 7GH", 
"NE5 7TH", "VB2 4RF"), class = "factor"), start_pc = structure(c(4L, 
3L, 4L, 2L, 1L), .Label = c("BV6 5PB", "CB3 5TH", "FC5 7YH", 
"Home", "NA"), class = "factor"), end_pc = structure(c(1L, 3L, 
3L, 3L, 2L), .Label = c("CB5 4FG", "GH6 8HG", "Home", "NA"), class = "factor")), .Names = c("ID", 
"home_pc", "start_pc", "end_pc"), row.names = 2:6, class = "data.frame") 
count = 1 
end = 3 
@ 

<<fun,echo=FALSE,eval=FALSE>>= 
print(xtable(df)) 
@ 


<<echo=FALSE,results=tex>>= 
for(i in 1:end) 
{ 
    print(xtable(df)) 
    i <- i + 1 
} 
cat("\\newpage") 
@ 

<<echo=FALSE,results=tex>>= 
if(count < end) 
<<fun>> 
count = count + 1 
cat("\\newpage") 
@ 

<<echo=FALSE,results=tex>>= 
if(count < end) 
<<fun>> 
count = count + 1 
cat("\\newpage") 
@ 

<<echo=FALSE,results=tex>>= 
if(count < end) 
<<fun>> 
count = count + 1 
cat("\\newpage") 
@ 

\end{document} 

快樂進入更多的細節,如果這是在正確的軌道!

+0

編輯版本,使用mtcars作爲@Ramnath(比我手工製作的好多了)是[here](ftp://godesberg.homelinux.net/test.Rnw)。我已經嘗試過展示那些公認的更長時間的靈活性。 – vaettchen 2012-02-02 17:35:43

0

下面是一個簡短的方法來做同樣的事情。我在R中使用mtcars數據集,並將說明如何按照柱面數創建表。您可以使用Sweaveknitr(這是該塊上的新孩子)處理此文檔。讓我知道它是如何工作的。

\documentclass{article} 
%\SweaveOpts{echo = F} 

\begin{document} 
<<load-libraries>>= 
suppressMessages(require(plyr)) 
suppressMessages(require(xtable)) 
@ 

<<gen-tables, results = tex>>= 
d_ply(mtcars, .(cyl), xtable, .print = TRUE) 
@ 

\end{document}