Подтвердить что ты не робот

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.

4b9b3361

Ответ 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.

** Вам потребуется преобразовать столбцы факторов в столбцы символов для этого метода.

Вывод