#r #r-markdown #reactable
#r #r-markdown #с возможностью реагирования
Вопрос:
Используя реактивный пакет R и RMarkdown, я хочу создать таблицу, в которой столбец имеет зеленый квадрат для статуса <= 2 и красный квадрат в противном случае.
Если я попытаюсь отформатировать столбец статуса на основе его значения, это создаст цветной квадрат. Смотрите изображение.
В приведенном ниже файле .Rmd я могу заставить css создать цветной квадрат в столбце, только если в столбце нет значений.
Подводя итог, под столбцом статуса я бы хотел цветные квадраты (зеленый квадрат для статуса <= 2 и красный квадрат в противном случае) без видимых цифр, выровненные по левому краю с именем статуса столбца.
Столбец Flag присутствует только для того, чтобы показать, что css работает.
Файл RMarkdown
title: Conditional Colored Square in Reactable Table
author: IX
date: 'September 5, 2020'
slug: test
categories: []
tags: []
output:
html_document
---
```{css, echo=FALSE}
.row {
display : flex;
align-items : center;
margin-bottom: 15px;
}
.box {
height: 20px;
width: 20px;
border: 1px solid black;
margin-right : 5px;
}
.red {
background-color: red;
}
.green {
background-color: green;
}
.blue {
background-color: blue;
}
```
```{r, echo=FALSE, message=FALSE, warning=FALSE}
library("reactable")
orders <- data.frame(
Order = 2300:2304,
Created = seq(as.Date("2019-04-01"), by = "day", length.out = 5),
Customer = sample(rownames(MASS::painters), 5),
Status = c(1, 2, 3, 4, 5),
Flag = c("", "", "", "", "")
)
reactable(orders, columns = list(
Status = colDef(cell = function(value) {
if (value <= 2) {
class <- paste0("tag box green", tolower(value))
htmltools::div(class = class, value)
}
}),
Flag = colDef(cell = function(value) {
class <- paste0("tag box green", tolower(value))
htmltools::div(class = class, value)
})
))
Ответ №1:
Использование css
— правильный путь.
Цвет не отображается в приведенном вами примере из-за paste
:
class <- paste0("tag box green", tolower(value))
что приводит к green1
, green2
, … которые являются неопределенными классами селектора.
Попробуй:
---
title: Conditional Colored Square in Reactable Table
author: IX
date: 'September 5, 2020'
slug: test
categories: []
tags: []
output:
html_document
---
```{css, echo=FALSE}
.row {
display : flex;
align-items : center;
margin-bottom: 15px;
}
.box {
height: 20px;
width: 20px;
border: 1px solid black;
margin-right : 5px;
}
.green {
background: green;
color: green;
}
.red {
background-color: red;
color: red;
}
```
```{r, echo=FALSE, message=FALSE, warning=FALSE}
library("reactable")
orders <- data.frame(
Order = 2300:2304,
Created = seq(as.Date("2019-04-01"), by = "day", length.out = 5),
Customer = sample(rownames(MASS::painters), 5),
Status = c(1, 2, 3, 4, 5),
Flag = c("", "", "","","")
)
reactable(orders, columns = list(
Status = colDef(cell = function(value) {
if (value <= 2) {
class <- "box green"
} else {
class <- "box red"
}
htmltools::div(class = class, "")
}),
Flag = colDef(cell = function(value) {
class <- paste0("tag box")
htmltools::div(class = class, value)
})
))
Комментарии:
1. Заменяет ли это: htmltools::div(class = class, «#») число в столбце состояния цветным символом «#», который не сразу виден, потому что фон того же цвета? Возможно ли это сделать без скрытого символа, как я продемонстрировал в столбце Флаг? Кроме того, цветные квадраты должны быть квадратами, а не закругленными прямоугольниками.
2. Я нашел закругленные квадраты аккуратными, но вы можете удалить их, установив для
border-radius
of.tag
значение 1px или даже 0. ‘#’ является заполнителем и может быть любым символом (но не пробелом), он исчезает в цвете фона. Преимущество персонажа в том, что он легко ориентируется по Статусу.3. смотрите мою правку с обоими решениями: скрытый символ или поле