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