У меня есть таблица в R с четырьмя столбцами. Имена первых столбцов — Джон Хелен и Джордж. Название второго столбца «Пицца» со значениями 0,7, 0,5, 0,33. Название третьего столбца «Паста» со значениями 0,4,0,7,0,2. Название четвертого столбца Sweet со значениями 0,9, 0,3, 0,2.
df <- data.frame(
Name = c("John", "Helen", "George"),
Pizza = c(0.7, 0.5, 0.33),
Pasta = c(0.4, 0.7, 0.2),
Sweet = c(0.9, 0.3, 0.2)
)
print(df)
Теперь я хочу покрасить каждую ячейку в соответствии с 3) критериями: если значение >=0,7, то покрасить ее в зеленый цвет, если значение ячейки <= 0,3 и >= 0,15 в желтый цвет, в противном случае в белый цвет.
library(formattable)
rules <- formatter(
"span",
style = x ~ style(
color = ifelse(x >= 0.7, "green", ifelse(x <= 0.3 & x >= 0.15, "yellow", "white"))
)
)
formattable_df <- as.data.frame(lapply(df, function(x) as.character(rules(x))))
print(formattable_df)
Теперь я хочу поместить их все в файл rmarkdown, чтобы отобразить латексный стиль PDF, предпочтительно латексную таблицу, но сохранить условную раскраску в полученном PDF-файле. Как я могу это сделать?
@cristian-vargas, можешь ли ты найти решение? Буду признателен. Как и ваш комментарий
Мне нравится делать это, создавая функцию, которая соответствующим образом форматирует данные, используя kableExtra::cell_spec():
set_background <- function(x, color = "white", format = "latex") {
kableExtra::cell_spec(x, format = format, background = color)
}
Затем вы можете применить это к соответствующим столбцам ваших данных, используя dplyr::across():
library(dplyr)
df |>
mutate(
across(Pizza:Sweet, \(x)
case_when(
x > 0.7 ~ set_background(x, "green"),
x >= 0.15 & x <= 0.3 ~ set_background(x, "yellow"),
TRUE ~ set_background(x)
)
)
) |>
kableExtra::kbl(format = "latex", booktabs=TRUE, escape=FALSE)
Убедитесь, что ваш yaml-заголовок rmarkdown содержит соответствующие пакеты:
---
output: pdf_document
header-includes:
- \usepackage{booktabs}
- \usepackage[table]{xcolor}
---
Выход:
круто. Но из любопытства у меня есть один вопрос: если бы мне пришлось выполнить рендеринг в HTML, изменение format = "latex"
на format = "html"
не сработало бы. Почему?
Это должно работать - обратите внимание, что вам нужно изменить format = "html"
в обоих вызовах kbl()
и set_background()
(и, очевидно, также изменить заголовок yaml)
Не ответ, но я предполагаю, что под «раскраской каждой ячейки» вы подразумеваете изменение цвета фона ячейки таблицы. В настоящее время ваша функция
formatter()
приводит к результату<span style = "color: green">
, который в конечном итоге изменит только цвет текста. Измените"span"
на «"td"
иcolor
наbackground-color
(экранировано обратными галочками!). Это приведет, например, к<td style = "background-color: green">
.