Цвета sweave, xtable, longtable и переменная строка... проблемы с `add.to.row`

Этот существующий вопрос охватывает способ чередовать цвета строк в латексной таблице путем последующей обработки вывода из print.xtable(), но я думаю, что можно достичь того же, используя add.to.row аргумент print.xtable() как описано в /questions/13170129/instrumentyi-ustraneniya-nepoladok-javascript-v-internet-explorer/13170131#13170131, избегая необходимости постобработки, что хорошо с Sweave. Этот ответ касается раскрашивания фона одной конкретной строки, но я думаю, что его можно расширить, раскрасив все нечетные строки.

Проблема, с которой я сталкиваюсь, связана с 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 ")

Мне нужно сохранить эту функциональность и добавить дополнительную функциональность, чтобы каждая вторая строка получала команду \\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 ответ

Решение

Хитрость заключается в том, чтобы сгладить список. Там может быть более красивый способ, следующее делает свое дело.

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 результата.

Другие вопросы по тегам