sweave,xtable,longtable和交替的行颜色......`add.to.row`的问题

mac*_*mac 3 latex r longtable sweave

这个现有的问题涵盖了通过对输出进行后处理来替换乳胶表中行颜色的方法print.xtable(),但我认为通过使用stats.stackexchange中描述的add.to.row参数可以实现相同的功能,从而避免了后处理,这对Sweave很好.该答案涉及着色一个特定行的背景,但我认为它可以扩展到着色所有奇数行.print.xtable()

我遇到的问题与add.to.row参数有关,使列表pos的长度等于字符向量的长度command.帮助文件print.xtable()描述:

add.to.row:两个组件的列表.第一个组件(应该称为'pos')是一个列表,其中包含最后应在其上添加额外命令的行的位置,第二个组件(应该称为'command')是一个相同的字符向量包含应在指定行末尾添加的命令的第一个组件的长度.默认值为"NULL",即不添加命令.

在使用longtable环境时,您可以使用此add.to.row参数来定义应在每个页面上打印的表的"标题"行,如下所示:

library(xtable)
my.df=data.frame(a=c(1:10),b=letters[1:10])
print(xtable(my.data.frame,caption="My Table"),
      tabular.environment="longtable",
      floating=FALSE,
      hline.after=c(-1,nrow(my.data.frame)),
      add.to.row=list(pos=list(0),command="\\hline \\endhead ")
Run Code Online (Sandbox Code Playgroud)

我需要保留此功能,并添加每隔一行应获取命令的其他功能 \\rowcolor[gray]{0.8}

听起来很简单.pos应该是类似的东西list=(0,1,3,5,7,9),command应该是类似的东西c("\\hline \\endhead ","\\rowcolor[gray]{0.8}","\\rowcolor[gray]{0.8}","\\rowcolor[gray]{0.8}","\\rowcolor[gray]{0.8}","\\rowcolor[gray]{0.8}")

当然,我想利用一些内置函数来构建奇数行序列和重复序列"\\rowcolor[gray]{0.8}",所以我想到了:

pos=list(0,seq(from=1,to=nrow(my.df),by=2))
Run Code Online (Sandbox Code Playgroud)

command=c("\\hline \\endhead ",
          rep("\\rowcolor[gray]{0.8}",length(seq(from=1,to=nrow(my.df),by=2))))
Run Code Online (Sandbox Code Playgroud)

我的问题是pos上面的列表评估为:

> pos
[[1]]
[1] 0

[[2]]
[1] 1 3 5 7 9
Run Code Online (Sandbox Code Playgroud)

长度为2 ......在这种情况下需要长度为6.

mac*_*mac 6

诀窍是将列表弄平.可能有一个更漂亮的方式,以下是诀窍.

pos=list(as.list(c(0,seq(from=1,to=nrow(my.df),by=2))))[[1]]
Run Code Online (Sandbox Code Playgroud)

整个包装是:

library(xtable)
my.df=data.frame(a=c(1:10),b=letters[1:10])

print(xtable(my.df,caption="My Table"),
      tabular.environment="longtable",
      floating=FALSE,
      hline.after=c(-1,nrow(my.df)),
      add.to.row=list(
      pos=list(as.list(c(0,seq(from=1,to=nrow(my.df),by=2))))[[1]],
      command=c("\\hline \\endhead ",
      rep("\\rowcolor[gray]{0.8}",length(seq(from=1,to=nrow(my.df),by=2)))))
      )
Run Code Online (Sandbox Code Playgroud)

哪个产生

% latex table generated in R 2.14.2 by xtable 1.7-0 package
% Thu Jan 31 12:52:55 2013
\begin{longtable}{rrl}
  \hline
 & a & b \\ 
  \hline \endhead 1 &   1 & a \\ 
   \rowcolor[gray]{0.8}2 &   2 & b \\ 
  3 &   3 & c \\ 
   \rowcolor[gray]{0.8}4 &   4 & d \\ 
  5 &   5 & e \\ 
   \rowcolor[gray]{0.8}6 &   6 & f \\ 
  7 &   7 & g \\ 
   \rowcolor[gray]{0.8}8 &   8 & h \\ 
  9 &   9 & i \\ 
   \rowcolor[gray]{0.8}10 &  10 & j \\ 
   \hline
\hline
\caption{My Table}
\end{longtable}
Run Code Online (Sandbox Code Playgroud)

乳胶的格式有点难看,因为\rowcolor它应该在行之前,即使我们指定了1,3,5,9,我们也会在2,4,6,8的输出上着色.