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

时间:2013-01-31 18:07:41

标签: r latex sweave longtable

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

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

  

add.to.row:两个组件的列表。第一个组成部分(应该是             被称为'pos')的列表包含行的位置             应该在最后添加哪些额外的命令,第二个             component(应该称为'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 ")

我需要保留此功能,并添加其他每行应获取命令的其他功能\\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))

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

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

> pos
[[1]]
[1] 0

[[2]]
[1] 1 3 5 7 9

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

1 个答案:

答案 0 :(得分:6)

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

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

然后整个包裹:

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)))))
      )

产生

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

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