4

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

我遇到的问题与add.to.row参数有关,使 listpos的长度等于 character vector 的长度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 ")

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

4

1 回答 1

7

诀窍是使列表变平。可能有一种更漂亮的方法,下面的方法可以解决问题。

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 上着色。

于 2013-01-31T18:07:41.173 回答