Условное форматирование строк с помощью grep в kable - PullRequest
1 голос
/ 25 июня 2019

Используя cell_spec можно условно отформатировать числовые ячейки в таблице kable на основе значения, но есть ли способ отформатировать ячейки на основе шаблонов в строке?

library(dplyr)
library(kableExtra)

df <- data.frame(x = c("bbb", "bba", "bbb"), y = c(-7, -7, 7)) %>%
  mutate(x = cell_spec(x, "html", color = ifelse(grep("a", x), "red", "black"))) %>%
  mutate(y = cell_spec(y, "html", color = ifelse(y < 0, "red", "black")))

kable(df, "html", escape = F) %>%
  kable_styling("striped")

Использование grep в приведенном выше коде делает весь столбец красным, в то время как я бы хотел, чтобы только ячейки, содержащие «а», были красными. Этот процесс работает для числовых значений в столбце "y". enter image description here

Ответы [ 2 ]

1 голос
/ 25 июня 2019

Согласно ?ifelse, использование

ifelse (тест, да, нет)

и

test - объект, который может быть приведен в логический режим.

При grep числовые индексы возвращаются на основе ?grep

значение - если FALSE, возвращается вектор, содержащий (целочисленные) индексы совпадений, определенных с помощью grep, а если TRUE, возвращается вектор, содержащий сами соответствующие элементы.

Таким образом, определенно, вход для ifelse 'test' не совпадает с выводом grep.

Если мы хотим использовать grep, мы можем использовать replace, где используется

заменить (х, список, значения)

список - индексный вектор

-код

library(kableExtra)
library(dplyr)
df <- data.frame(x = c("bbb", "bba", "bbb"), y = c(-7, -7, 7)) %>%
     mutate(x = cell_spec(x, "html", 
               color = replace(rep("black", n()), grep("a", x), "red")), 
            y = cell_spec(y, "html", 
               color = ifelse(y < 0, "red", "black")))

kable(df, "html", escape = F) %>% kable_styling("striped")

-выход

enter image description here

1 голос
/ 25 июня 2019

Используйте grepl вместо grep, так как grepl возвращает логический вектор, тогда как grep возвращает индекс совпадения, а ifelse ожидает логический вектор.

library(dplyr)
library(kableExtra)

df <- data.frame(x = c("bbb", "bba", "bbb"), y = c(-7, -7, 7)) %>%
 mutate(x = cell_spec(x, "html",color = ifelse(grepl("a", x), "red", "black"))) %>%
 mutate(y = cell_spec(y, "html", color = ifelse(y < 0, "red", "black")))


kable(df, "html", escape = F) %>% kable_styling("striped")

enter image description here

...