Создайте стол для кейбла с полноцветным фоном

У меня проблемы с созданием красиво отформатированной таблицы в R. Я нахожусь на 90% пути, но не могу пройти весь путь.

Мне нужно окрасить всю ячейку в цвет фона, как показано в примере ниже. Я прочитал kable виньетку и увидел, что в формате html background не окрашивает всю ячейку. Есть ли способ обойти это? Вместо этого я попытался установить его на латекс, но результат был латексным, а не отображался в средстве просмотра. Я также начинающий markdown пользователь, поэтому, когда я попробовал это там, результат оказался не тем, на что я надеялся (это просто автономная таблица).

Я много искал в SO решение, но так и не смог его найти. Конечно, создавать таблицы в R непросто. Любая помощь будет оценена по достоинству.

Образец данных:

library(tidyverse)
df <- structure(list(Indicator = c("Var1", "Var2", "Var3", "Var4", "Var5"
), Sign = c(-1L, 1L, 1L, -1L, 1L), Freq = c("M", "A", "Q", "M", 
                                            "M")), row.names = c(NA, -5L), class = c("tbl_df", "tbl", "data.frame"))
df
# A tibble: 5 x 3
  Indicator  Sign Freq 
  <chr>     <int> <chr>
1 Var1         -1 M    
2 Var2          1 A    
3 Var3          1 Q    
4 Var4         -1 M    
5 Var5          1 M 

Попытка кода:

library(kable)
library(kableExtra)
df  %>% 
      dplyr::rename(Trend = Freq) %>%
      mutate(Indicator = cell_spec(Indicator, "html", color = "black", bold = T), 
             Trend = cell_spec(Trend, "html", color = "white", bold = T, 
                               background = factor(Sign, c(-1, 0, 1), 
                                                   c("red", "gray", "green")))) %>%
      select(Indicator, Trend) %>%
      kable(align = c('l', 'c'), format = "html", escape = F) %>%
      kable_styling(bootstrap_options = c("bordered", full_width = F, font_size = 16)) %>% 
      row_spec(0, background = "rgb(172, 178, 152)", color = "black", font_size = 18)

Таблица вывода


person hmhensen    schedule 30.08.2019    source источник
comment
Я не уверен, что это возможно с _1 _ / _ 2_, возможно, вам придется посмотреть форматируемую таблицу вместо этого.   -  person Marius    schedule 30.08.2019


Ответы (1)


Я упростил исходные данные, чтобы было понятно:

df <- tribble(~Indicator, ~Freq, ~cellColor,
              'Speed', 43.342, 'red',
              'Altitude', 44.444, 'blue',
              'Smartness', 0.343, 'green')

Для успеха нам нужно создать объект таблицы (tbl), потому что библиотека kable имеет функцию column_spec для установки фиксированной ширины столбца.

tbl <- df %>% 
  mutate(Indicator = cell_spec(Indicator, "html", color = "black", bold = T), 
         Freq = cell_spec(x = Freq, 
                           format = "html", 
                           color = "white", 
                           bold = T, 
                           extra_css = paste(paste('background-color', cellColor, sep = ': '), # combine background-color CSS rule with the observation vector value
                                             'display: inline-block', # extremely important CSS modifier for the span tag in the table cell
                                             'text-align: center', # text align
                                             'padding: 0px', # expand the field of text
                                             'margin: 0px', # expand the field of text
                                             'width: 200px', # future cell/column width
                                             sep = "; "), # CSS notation rule
                           )
  ) %>%
  select(-cellColor) %>% # exclude cellColor vector
  kable(format = "html", escape = F) %>%
  kable_styling(bootstrap_options = c("bordered", full_width = F, font_size = 16))

column_spec(tbl, 2, width = "200px") # set the column width as the cell width

tbl # print

Как видите, важно соответствие размера столбца и ячейки. В качестве примера я сделал их шириной 200 пикселей.

Результат:

введите здесь описание изображения

person Ruben Kazumov    schedule 30.08.2019
comment
Странно, что это невозможно даже в других пакетах. Я провел быстрый поиск на основе вашего ответа, и это невозможно сделать даже в прямом CSS. Какая-то проблема с html или что-то в этом роде. Думаю, мне нужно изучить уценку. В любом случае, на данный момент это лучшее решение, поэтому я выбрал его как правильный. Спасибо за вашу помощь. - person hmhensen; 31.08.2019