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

时间:2018-03-08 14:53:20

标签: r shiny dt

我有一个数据集:

ID Value
102 306
41  800
101 783
105 193
myID 334

我想把它画成一个数据表,其中只有带有' myID'的行。是橙色的,桌子的其余部分是蓝色的。看过helper functionsother examples后,似乎我应该使用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')))

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

2 个答案:

答案 0 :(得分:6)

如果您想使用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
)

结果如下:

enter image description here

您也可以使用包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")))

结果如下:

enter image description here

答案 1 :(得分:0)

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

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

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

enter image description here

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))