2013-09-23 6 views
11

Уважаемый пользователь R xtable и knitr: Я боролся с этой проблемой в течение нескольких дней, и я очень удивлен, что нет подобного случая, о котором сообщалось кто-то уже. Ваше понимание и помощь приветствуются.Knitr xtable row color result в 2-й таблице в ячейке заголовка строки, затемненной

Я использовал xtable для создания двух или более таблиц. Строки в таблицах поочередно окрашены. Первая таблица в порядке. Но, начиная со второй таблицы (или более), самая большая ячейка заголовка всегда затемняется.

К сожалению, это очень воспроизводимо. После первой приятной таблицы я всегда получал точно такой же загорелый заголовок. Вот коды, чтобы воспроизвести его:

\documentclass{article} 
\usepackage{booktabs} 
\usepackage{colortbl, xcolor} 

\begin{document} 
<<echo=TRUE,results='asis'>>= 
employee <- c('John Doe','Peter Gynn','Jolie Hope') 
salary <- c(21000, 23400, 26800) 

mydata <- data.frame(employee, salary) 
rws <- seq(1, (nrow(mydata)), by = 2) 
col <- rep("\\rowcolor[gray]{0.90}", length(rws)) 
library(xtable) 
print(xtable(mydata, caption="Test"), booktabs = TRUE, 
     include.rownames = FALSE, caption.placement = "top", 
     sanitize.colnames.function = identity, 
     add.to.row = list(pos = as.list(rws), command=col)) 

print(xtable(mydata, caption="Test"), booktabs = TRUE, 
     include.rownames = FALSE, caption.placement = "top", 
     sanitize.colnames.function = identity, 
     add.to.row = list(pos = as.list(rws), command=col)) 
@ 

\end{document} 

Выход:

xtable output

И мой sessionInfo() выглядит следующим образом:

> sessionInfo() 
R version 3.0.1 (2013-05-16) 
Platform: i386-w64-mingw32/i386 (32-bit) 

locale: 
[1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252 LC_MONETARY=English_United States.1252 
[4] LC_NUMERIC=C       LC_TIME=English_United States.1252  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

loaded via a namespace (and not attached): 
[1] digest_0.6.3 evaluate_0.4.7 formatR_0.9 knitr_1.4.1 stringr_0.6.2 tools_3.0.1 
+0

Я могу подтвердить это, и я посмотрю, что там происходит. –

ответ

11

Это легко исправить: просто изменить nrow(mydata) - nrow(mydata) - 1, и вы больше не увидите черную ячейку.

Основная проблема довольно тонкий здесь: у вас есть 3 строки, и seq(1, nrow(mydata), by = 2) дает c(1, 3), то вы говорите xtable добавить \rowcolor[gray]{0.90} после первого и третьего ряда, который генерирует следующую таблицу:

\begin{tabular}{lr} 
    \toprule 
employee & salary \\ 
    \midrule 
John Doe & 21000.00 \\ 
    \rowcolor[gray]{0.90}Peter Gynn & 23400.00 \\ 
    Jolie Hope & 26800.00 \\ 
    \rowcolor[gray]{0.90} \bottomrule % <-- the problem is here 
\end{tabular} 

Итак, в конце таблицы есть дополнительная команда \rowcolor[gray]{0.90}, которая по какой-то причине имеет побочный эффект для следующей таблицы. Решение состоит в том, что после последней строки вы не должны добавлять \rowcolor[gray]{0.90}, поэтому вам нужно сгенерировать последовательность от 1 до nrow(data) - 1 вместо nrow(data).

Теперь вы должны увидеть ожидаемый результат:

+0

+1 для Q и A, BTW, как можно принудительно выполнить вывод для оценки длины серого затененного блока? – doctorate

+0

@doctorate Я думаю, что нет волшебного пути, или вы можете написать функцию-обертку для этого –

+0

извините за поздний ответ, можете ли вы PLS передать мне хороший пример, который был реализован с помощью функции обертки? это было бы очень мило с вашей стороны. – doctorate