DT in Shiny:仅更改单行的颜色

Hes*_*ons 5 r shiny dt

我有一个数据集:

ID Value
102 306
41  800
101 783
105 193
myID 334
Run Code Online (Sandbox Code Playgroud)

我想把它画成一个数据表,其中只有'myID'的行是橙色的,而其余的表是蓝色的.看过辅助函数其他示例,似乎我应该使用styleEqual.但是,我不知道其他行中的值是什么,并且它们也会动态更改.

我试过用

datatable(tableData) %>%
formatStyle(0, target= 'row',color = 'black', backgroundColor = tableColour, 
                lineHeight='70%', padding = '3px 3px', fontSize = '80%') %>%
    formatStyle('ID', target = 'row', 
    backgroundColor = styleEqual(c("myID"), c('orange')))
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用 - 整个表是蓝色的,第二个formatStyle语句被忽略.如果我删除第一个formatStyle,我的行会变成橙色,但会丢失所有其他格式.有没有办法使用styleEqual来定义eg c("myID", "All other IDs"),还是有另一种解决方法?

cle*_*ens 7

如果要使用DT,可以使用styleEqual()在条件满足时为表添加背景颜色.似乎没有else选项,因此您可以创建类的对象JS_EVAL(将由其返回styleEqual())并添加否定:

background <- "value == 'myID' ? 'orange' : value != 'else' ? 'blue' : ''"  
class(background) <- "JS_EVAL"

datatable(tableData) %>% formatStyle(
  'ID',
  target = 'row',
  backgroundColor = background
)
Run Code Online (Sandbox Code Playgroud)

结果如下:

在此输入图像描述

您也可以使用包来实现它tableHTML:

library(tableHTML)

tableData %>% 
  tableHTML(rownames = FALSE,
            widths = c(100, 100)) %>% 
  add_css_row(rows = which(tableData$ID == 'myID') + 1,
              css = list(c("background-color"),
                         c("orange"))) %>% 
  add_css_row(rows = which(tableData$ID != 'myID') + 1,
              css = list(c("background-color"),
                         c("blue")))
Run Code Online (Sandbox Code Playgroud)

结果如下:

在此输入图像描述


Flo*_*ian 3

我可以想到两种可能的解决方法:

  • 根据您的列是否等于myID或不等于,创建一个值为 1 或 0 的辅助列,然后使用该列设置表格样式并隐藏该列。
  • 为 列 中的所有唯一值创建列映射ID,默认为某种颜色,并仅将对应的值设置为myID橙色。

下面给出了第二个选项的工作示例。希望这可以帮助!


在此输入图像描述

df = read.table(text='ID Value
102 306
41  800
101 783
105 193
myID 334',header=T)

library(DT)

my_vals = unique(df$ID)
my_colors = ifelse(my_vals=='myID','orange','grey')

datatable(df) %>%
  formatStyle('ID', target = 'row', 
              backgroundColor = styleEqual(my_vals,my_colors))
Run Code Online (Sandbox Code Playgroud)