【问题标题】:DT in Shiny: Change only the colour of a single rowShiny中的DT:仅更改单行的颜色
【发布时间】:2018-08-16 23:29:00
【问题描述】:

我有一个数据集:

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"),还是有其他解决方法?

【问题讨论】:

    标签: r shiny dt


    【解决方案1】:

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

    结果如下:

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

    结果如下:

    【讨论】:

    • 这也很有帮助,谢谢。我不能使用 tableHTML,因为该表还具有动态排序和列选择,但 JS_EVAL 路由肯定会工作。
    • 非常好的解决方案!你能详细说明一下你是如何得到这个解决方案的吗?你怎么知道使用“价值”这个词?在声明中? PS:在尝试了解您的解决方案如何工作时,我确实发现您也可以使用JS() 在一行中创建一个JS_EVAL 类的对象。
    • 谢谢! :)这是一步一步的方法,首先我使用styleEqual("myID", "orange")将橙色添加到一行,然后我找不到添加否定的方法并检查函数的输出,更改并使用它。跨度>
    【解决方案2】:

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

    • 根据您的列是否等于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))
    

    【讨论】:

    • 我真的很喜欢第二种解决方案,因为它使用了当前数据。但是,辅助列当然也是一种选择。谢谢。
    猜你喜欢
    • 2020-06-24
    • 2018-03-18
    • 2021-03-17
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 2020-08-13
    相关资源
    最近更新 更多