【问题标题】:How to change fixed columns color and display POSIXct data in DT::datatable Shiny?如何更改固定列颜色并在 DT::datatable Shiny 中显示 POSIXct 数据?
【发布时间】:2020-07-18 03:59:30
【问题描述】:

我在 Shiny 中使用 superhero 主题以及下面的行,这有助于使过滤器的文本颜色变为黑色,

ui <- fluidPage(
    theme = shinytheme("superhero"),
    tags$head(tags$style("div.dataTables_scrollHead span {color: black;}")),
    ...
)

1. 但是,固定列(时间列1)的颜色与主题的颜色并不不一致。它是白色的,很难看到文字。如何更改它以匹配超级英雄主题的颜色或将其更改为更用户友好的颜色?

更新:所以我设法更改了固定列的颜色,但我希望一行是深蓝色,另一行是浅蓝色。加上行索引和列标题仍然是白色的,如下图所示。

output$mytable     <- DT::renderDataTable(datatable(df,rownames = T,
                                                     filter="top", 
                                                      extensions = "FixedColumns",style = 'bootstrap',
                                                      options = list(scrollX = TRUE, scrollY = TRUE,
                                                                     autoWidth = F,
                                                                     columnDefs = list(list(width = '145px', targets = c(1))),
                                                                     fixedColumns=list(leftColumns=2))) 
                                                     %>%formatRound(c(2:l_agg), 2)%>% formatStyle('Timestamp',backgroundColor='#2B3E50'))

更新图片

2. 现在固定列(时间)是character 类型(从POSIXct 转换为字符),我尝试将POSIXct 时间放在datatable但时区不同。我应该如何拥有POSIXct 类型的时间列并在数据表中正确格式化?

例如,这是我拥有的时间序列数据,理想情况下,我希望 Shiny 数据如下所示,不包含 CST 部分。

[1] "2020-04-06 09:31:20.000 CST" "2020-04-06 09:31:51.000 CST" "2020-04-06 09:32:21.000 CST" "2020-04-06 09:32:50.000 CST"
[5] "2020-04-06 09:33:21.000 CST" "2020-04-06 09:33:51.000 CST"

结构是

structure(c(1586136680.0005, 1586136711.0005, 1586136741.0005, 
1586136770.0005, 1586136801.0005, 1586136831.0005), class = c("POSIXct", 
"POSIXt"), tzone = "")

但是,在 Shiny 中,它显示如下,这不是我想要的。

【问题讨论】:

    标签: r datatable shiny


    【解决方案1】:

    它真的需要属于Posixct 类才能显示在表格中吗?为什么不直接将其转换为 CST 时区,然后将日期转换为字符?

    关于您的行号为白色的第二个问题,我们可以使用自定义 css 标签来定义行颜色并将 CSS 包含在 tags$head(tags$style(HTML()))) 中。我们也可以添加您在同一个调用中使用的 CSS。请注意,此处定义的 CSS 会影响行号颜色。具有数据行的列的颜色由backgroundColor = styleEqual(df$Timestamp, row_colours) 定义。我们使用 CSS 将行号的颜色与行其余部分的颜色相匹配。

    library(shiny)
    library(shinythemes)
    library(data.table)
    library(DT)
    library(timeDate)
    
    df <- structure(c(1586136680.0005, 1586136711.0005, 1586136741.0005,1586136861.0005, 1586136861.0005,
                      1586136801.0005, 1586136831.0005, 1586136861.0005), class = c("POSIXct", 
                                                                                    "POSIXt"), tzone = "") 
    
    df <- data.frame(Timestamp = df)
    
    df$Timestamp <- as.character(.POSIXct(df$Timestamp-3600*7, tz="CST6CDT"))
    
    l_agg <- 10
    
    ui <- fluidPage(
    
      tags$head(tags$style(HTML('
    
      table th {
        background:#4e5d6c;
    }
    
      table tr:nth-child(odd) td{
               background:#2B3E50;
    }
    table tr:nth-child(even) td{
                background:#4e5d6c;
    }
    
    div.dataTables_scrollHead span {color: black;}
    
    '))),
    
      theme = shinytheme("superhero"),
      DT::dataTableOutput("mytable")
    
    ) 
    
    if (!round(length(df$Timestamp)/2,0) %% 2) {
      row_colours <- rep(c('#2B3E50', '#4e5d6c'), length(df$Timestamp)/2)
      } else {
      row_colours <- rep(c('#2B3E50', '#4e5d6c'), round(length(df$Timestamp)/2,0))[-length(df$Timestamp)]
    }
    
    server <- function(input, output, session) {
      output$mytable     <- DT::renderDataTable(DT::datatable(df,rownames = T,
                                                              filter="top", 
                                                              extensions = "FixedColumns",style = 'bootstrap',
                                                              options = list(scrollX = TRUE, scrollY = TRUE,
                                                                             autoWidth = F,
                                                                             columnDefs = list(list(width = '1444px', targets = c(1))),
                                                                             fixedColumns=list(eftColumns=1))) 
                                                %>%formatRound(c(2:l_agg), 2)%>% formatStyle('Timestamp',backgroundColor = styleEqual(df$Timestamp, row_colours)))
    }
    
    shinyApp(ui, server)
    
    

    【讨论】:

    • 关于时间戳部分,现在已经在字符类了。我正在考虑解决这个问题。
    • 我正在尝试代码。只想问什么是df_lev,为什么是nrow(df)/2,我的代码生成了一个错误消息说length(levels) must be equal to length(values)
    • 似乎添加 CSS 代码足以使固定列(时间戳)看起来像其他列的其余部分。为timestamp 添加formatStyle 只是使整个列具有深蓝色。非常感谢。我对CSS 一无所知,但有没有办法合并 2 tags$head(tags$style 语句?或者它们必须是 2 个单独的语句,因为一个是分配颜色表背景和行,另一个是分配颜色到列标题?
    • 不,您可以将它们添加到同一个标签中。我再次编辑了我的答案以反映这一点。希望这能解决一切
    • 非常感谢您的出色回答。正是我正在寻找的。最后一件事:CSS 代码和formatStyle(...row_colours) 做同样的事情,对吗?如果行号为奇数,row_colours 可能无法按预期工作。
    猜你喜欢
    • 2021-08-27
    • 2018-03-18
    • 1970-01-01
    • 2018-08-16
    • 2022-01-17
    • 2020-06-24
    • 2018-12-28
    • 2021-03-17
    • 1970-01-01
    相关资源
    最近更新 更多