R - Условное выделение строк в таблице HTML, созданной с использованием xxtable или kable
Я довольно много начинаю с программным форматированием вывода R, но у меня есть базовое понимание возможностей knitr
, xtable
, Markdown и Pandoc конвертировать один формат разметки в другой. Я хочу записать R-фрейм данных df
в таблицу HTML и применить конкретный цвет к каждой строке, удовлетворяющей условию (например, df$outcome == 1
). Однако я не уверен, какой пакет выполнил бы это простым и эффективным способом, но из просмотра нескольких потоков форматирования таблицы (xtable
thread 1, xtable
thread 2, kable
документация 1), я собрал это kable
и xtable
могут быть способны выполнить мой желаемый результат.
Чтобы пояснить, вот мой воспроизводимый пример (используя xtable
, но меня интересует ответ с помощью kable
или другого пакета):
set.seed(123)
df <- data.frame(id = sample(1:100, 20, replace = TRUE),
inputval = sample(seq(0, 1, by=0.01), 20, replace = TRUE),
outcome = sample(1:4, 20, replace = TRUE))
library(xtable)
dfxt <- xtable(df)
knit2html(input = "~/rowcolor_ex.Rmd",
output = OUTPUTHERE
stylesheet = "STYLESHEET.css")
с knit2html
, ссылаясь на файл с именем "rowcolor_ex.Rmd", показанный ниже:
```{r,echo=FALSE,results='asis',warning=FALSE,message=FALSE}
print(dfxt,
type = "html",
include.rownames = FALSE,)
```
Я понимаю, что если я буду использовать xtable
, я бы включил один или несколько аргументов после print(dfxt,
части вызова функции в документе Rmd
и этот поток показывает аргумент add.to.row
, который имеет смысл для type = "latex"
, но неясно, как код изменится для вывода HTML. Кроме того, я не уверен, что если ссылаться на таблицу стилей CSS в knit2html
будет переопределять форматирование таблицы HTML.
Ответы
Ответ 1
Вот решение, использующее Gmisc::htmlTable
set.seed(123)
df <- data.frame(id = sample(1:100, 20, replace = TRUE),
inputval = sample(seq(0, 1, by=0.01), 20, replace = TRUE),
outcome = sample(1:4, 20, replace = TRUE))
cols <- with(df, ifelse(outcome == 1, 'magenta', 'white'))
library(Gmisc)
htmlTable(as.matrix(df), altcol = cols,
rgroup = '', n.rgroup = rep(1, length(cols)))
ИЗМЕНИТЬ
Поскольку htmlTable
с тех пор перемещен в пакет, htmlTable
и больше не находится в Gmisc
>= 1.0, новый способ сделать это будет
library('htmlTable')
htmlTable(as.matrix(df), col.rgroup = cols)
который также дает:
![enter image description here]()
и ваш код уценки будет просто
```{r, results='asis'}
htmlTable(as.matrix(df), altcol = cols,
rgroup = '', n.rgroup = rep(1, length(cols)))
```
И мой .Rmd будет выглядеть так:
---
output:
html_document:
css: ~/knitr.css
---
```{r, results='asis', message=FALSE}
set.seed(123)
df <- data.frame(id = sample(1:100, 20, replace = TRUE),
inputval = sample(seq(0, 1, by=0.01), 20, replace = TRUE),
outcome = sample(1:4, 20, replace = TRUE))
cols <- with(df, ifelse(outcome == 1, 'magenta', 'white'))
library(Gmisc)
htmlTable(as.matrix(df), altcol = cols,
rgroup = '', n.rgroup = rep(1, length(cols)))
```
Ответ 2
Ну, не используя цвета (как не поддерживаемые markdown), но вы можете выделить ячейки/строки/столбцы таблицы с pandoc.table и , используя жирный или курсивный шрифт:
> library(pander)
> emphasize.rows(which(df$outcome == 2))
> pander(df)
-------------------------
id inputval outcome
---- ---------- ---------
29 0.89 1
*79* *0.69* *2*
*41* *0.64* *2*
*89* *1* *2*
95 0.66 1
5 0.71 1
53 0.54 1
*90* *0.6* *2*
*56* *0.29* *2*
46 0.14 4
96 0.97 1
*46* *0.91* *2*
68 0.69 4
58 0.8 1
11 0.02 3
90 0.48 1
25 0.76 1
5 0.21 4
33 0.32 4
*96* *0.23* *2*
-------------------------
Ответ 3
Вот решение, использующее ReporteRs
:
set.seed(123)
df <- data.frame(id = sample(1:100, 20, replace = TRUE),
inputval = sample(seq(0, 1, by=0.01), 20, replace = TRUE),
outcome = sample(1:4, 20, replace = TRUE))
library( ReporteRs )
library( magrittr )
# create and format table
myft = df %>% FlexTable() %>%
setRowsColors( df$outcome == 1, 'magenta') %>%
setFlexTableWidths( c( 1, 1, 1) )
# create an html doc and send myft into
doc = bsdoc() %>% addFlexTable( myft )
# write the html file in a new dir
writeDoc( doc, "example_out/df.html")
Ответ 4
Я много играл с форматированием документов RMarkdown.
Поскольку RMarkdown преобразуется в LaTeX до создания PDF файла, вы можете передать аргументы, которые будут работать в LaTeX для RMarkdown.
Итак, добавив
header-includes:
- \usepackage{xcolor}
в заголовке документа RMarkdown, а затем добавив что-то вроде
for(i in seq(1, nrow(yourDataframe), by = 2)){
yourDataframe[i, ] <- paste0("\\color{purple}", yourDataframe[i, ])
row.names(yourDataframe)[i] <- paste0("\\color{purple}", row.names(yourDataframe)[i])
}
вы получите фиолетовый (или любой цвет, указанный и разрешенный в пакете xcolor LaTeX) в каждой другой строке таблицы. Еще один способ подчеркнуть записи, которые не являются жирным или курсивом.
Это не подсветка строк, но может дать вам дополнительные настраиваемые параметры.
* Протестировано с помощью пакета pander.
** Вам потребуется преобразовать столбцы факторов в столбцы символов для этого метода.
![Вывод]()