在 R Shiny 中突出显示 DT 对角线
Highlight DT diagonal in R Shiny
我在 Shiny 应用程序中有大量数据table,我想突出显示对角线,使用类似 if rowNum == colNum then 'blue' else 'white'
.
的逻辑
rowCallback
DT 选项可以让我按行号设置样式,但我在文档中找不到任何可以同时对列号执行等效操作的内容。
我最好的想法是在 table 中创建 ~200 个额外的布尔列,以确定每个单元格是否突出显示,隐藏它们,并使用 formatStyle(valueColumns = 201:400)
设置其他样式.但这在这里似乎有点矫枉过正。有什么好主意吗?
library(tidyverse)
library(DT)
data <- rbind(c(1,2,3), c(4,5,6), c(7,8,9)) %>% as_tibble()
data
#> # A tibble: 3 x 3
#> V1 V2 V3
#> <dbl> <dbl> <dbl>
#> 1 1 2 3
#> 2 4 5 6
#> 3 7 8 9
data <-
data %>%
mutate(row_id = row_number()) %>%
pivot_longer(-row_id) %>%
group_by(row_id) %>%
mutate(
col_id = row_number(),
value = value %>% as.character(),
value = case_when(
row_id == col_id ~ str_glue("<div style = 'color:red'> {value} </div>"),
TRUE ~ value
)
) %>%
ungroup() %>%
select(row_id, name, value) %>%
pivot_wider() %>%
select(-row_id)
data
#> # A tibble: 3 x 3
#> V1 V2 V3
#> <glue> <glue> <glue>
#> 1 <div style = 'color:red'>… 2 3
#> 2 4 <div style = 'color:red'… 6
#> 3 7 8 <div style = 'color:red'…
datatable(escape = FALSE, data)
@danloo 的回答给出了所需的渲染,但您应该避免在单元格中使用 HTML,因为它会干扰排序。这是 rowCallback
:
的一种方式
library(DT)
js <- c(
"function(row, data, displayNum, displayIndex, dataIndex){",
" $('td:eq(' + dataIndex + ')', row).css('background-color', 'yellow');",
"}"
)
dat <- as.data.frame(matrix(1:9, nrow = 3))
datatable(
dat,
rownames = FALSE,
options = list(
rowCallback = JS(js)
)
)
我在 Shiny 应用程序中有大量数据table,我想突出显示对角线,使用类似 if rowNum == colNum then 'blue' else 'white'
.
rowCallback
DT 选项可以让我按行号设置样式,但我在文档中找不到任何可以同时对列号执行等效操作的内容。
我最好的想法是在 table 中创建 ~200 个额外的布尔列,以确定每个单元格是否突出显示,隐藏它们,并使用 formatStyle(valueColumns = 201:400)
设置其他样式.但这在这里似乎有点矫枉过正。有什么好主意吗?
library(tidyverse)
library(DT)
data <- rbind(c(1,2,3), c(4,5,6), c(7,8,9)) %>% as_tibble()
data
#> # A tibble: 3 x 3
#> V1 V2 V3
#> <dbl> <dbl> <dbl>
#> 1 1 2 3
#> 2 4 5 6
#> 3 7 8 9
data <-
data %>%
mutate(row_id = row_number()) %>%
pivot_longer(-row_id) %>%
group_by(row_id) %>%
mutate(
col_id = row_number(),
value = value %>% as.character(),
value = case_when(
row_id == col_id ~ str_glue("<div style = 'color:red'> {value} </div>"),
TRUE ~ value
)
) %>%
ungroup() %>%
select(row_id, name, value) %>%
pivot_wider() %>%
select(-row_id)
data
#> # A tibble: 3 x 3
#> V1 V2 V3
#> <glue> <glue> <glue>
#> 1 <div style = 'color:red'>… 2 3
#> 2 4 <div style = 'color:red'… 6
#> 3 7 8 <div style = 'color:red'…
datatable(escape = FALSE, data)
@danloo 的回答给出了所需的渲染,但您应该避免在单元格中使用 HTML,因为它会干扰排序。这是 rowCallback
:
library(DT)
js <- c(
"function(row, data, displayNum, displayIndex, dataIndex){",
" $('td:eq(' + dataIndex + ')', row).css('background-color', 'yellow');",
"}"
)
dat <- as.data.frame(matrix(1:9, nrow = 3))
datatable(
dat,
rownames = FALSE,
options = list(
rowCallback = JS(js)
)
)