【问题标题】:Color values don't show up when editing other DT column values it's based on R Shiny编辑基于 R Shiny 的其他 DT 列值时,颜色值不显示
【发布时间】:2021-11-02 10:42:48
【问题描述】:

我有一个列“R/Y/G”,它应该包含三种颜色的绿色、黄色或红色,基于三个不同列 R、Y 和 G 的值。条件是,如果列“R”的值是大于 250 万,'R/Y/G' 中对应单元格的颜色为红色。如果“Y”列的值在 2 到 250 万之间,则“R/Y/G”中相应单元格的颜色为黄色。如果“G”列的值小于 2 mil,则“R/Y/G”中对应单元格的颜色为绿色。这里的条件:

d9$tcolor <- ifelse(d9$R > 2500000, 2,
                        ifelse(d9$Y > 2000000 & d9$Y <= 2500000, 1,
                               ifelse(d9$G <= 2000000, 0)))

dt_d9=datatable(isolate(d9), editable = 'cell', rownames = FALSE, extensions = 'Buttons', options = list(dom = 'Bfrtip', buttons = I('colvis'))) %>% formatStyle(
    'R/Y/G', 'tcolor',
    backgroundColor = styleEqual(c(0,1,2), c('green', 'yellow', 'red')),fontWeight = 'bold'
  )

tcolor 是我创建的用于跟踪三列(“R”、“Y”和“G”)的列,“R/Y/G”列的颜色将取决于 tcolor,具体取决于什么值我输入“R”、“Y”和“G”

这是在实际代码中实现的地方:

cmp_data1 <- dbGetQuery(qr,sql)

saveRDS(cmp_data1, 'q1.rds')

dt_output = function(title, id) {
  fluidRow(column(
    12, h1(paste0(title)),
    hr(), DTOutput(id)
  ))
}

render_dt = function(data, editable = 'cell', server = TRUE, ...) {
  renderDT(data,selection = 'none', server = server, editable = editable, ...)
}

ui = fluidPage(
  downloadButton("mcp_csv", "Download as CSV", class="but"),
  
  dt_output('Report', 'x9')
)

server = function(input, output, session) {
  if(!file.exists("cm.rds")){
    d9 = cmp_data1
    d9['R/Y/G'] <- NA
    d9['R'] <- NA
    d9['Y'] <- NA
    d9['G'] <- NA
    d9['tcolor'] <- NA
  }
  else{
    cmp <- readRDS("cm.rds")
    d9 = cbind(cmp_data1, cmp[,(ncol(cmp)-4):ncol(cmp)])
  }
  
  rv <- reactiveValues()
  observe({
    rv$d9 <- d9
  })
  
  dt_d9=datatable(isolate(d9), editable = 'cell', rownames = FALSE, extensions = 'Buttons', options = list(dom = 'Bfrtip', buttons = I('colvis'))) %>% formatStyle(
    'R/Y/G', 'tcolor',
    backgroundColor = styleEqual(c(0,1,2), c('green', 'yellow', 'red')),fontWeight = 'bold'
  )
  
  output$x9 = render_dt(dt_d9)
  
  proxy = dataTableProxy('x9')
  observe({
    DT::replaceData(proxy, rv$d9, rownames = FALSE, resetPaging = FALSE)
  })
  
  observeEvent(input$x9_cell_edit, {
    rv$d9 <<- editData(rv$d9, input$x9_cell_edit, 'x9', rownames = FALSE)
    d9 <- rv$d9
    d9$tcolor <- ifelse(d9$R > 2500000, 2,
                        ifelse(d9$Y > 2000000 & d9$Y <= 2500000, 1,
                               ifelse(d9$G <= 2000000, 0)))
    rv$d9 <<- d9
    saveRDS(d9, 'cm.rds')
    
  })

但这似乎不起作用。颜色不显示。

【问题讨论】:

    标签: r shiny dt rstudio-server


    【解决方案1】:

    创建的空列获取字符类型而不是数字,因此您必须创建具有数字类型的空列,如下所示:

      d9['R/Y/G'] <- numeric()
      d9['R'] <- numeric()
      d9['Y'] <- numeric()
      d9['G'] <- numeric()
      d9['tcolor'] <- numeric()
    

    通过插入断点来检查对象/列的类型来了解 how to debug Shiny apps

    顺便说一句,d9$G &gt; 2000000的情况你不处理。

    编辑:如果您需要在用户输入任何值之前显示一些默认颜色,您应该为 tcolor 列设置一些默认值,例如绿色:

      d9['tcolor'] <- 1
    

    要获得所需的级联条件行为并且不受 NA 值的干扰(当没有在列中输入值时),您可以使用 dplyrpackage (see this post) 中的 case_when() 函数:

    d9$tcolor <- dplyr::case_when(d9$R > 2500000 ~ 2,
                          d9$Y > 2000000 & d9$Y <= 2500000 ~ 0,
                          d9$G < 2000000 ~ 1) 
    

    【讨论】:

    • 默认情况下,'R/Y/G' 应该是绿色的,即使没有输入值。此外,在编辑“R”列时仅显示红色。黄色和绿色不显示。在编辑“Y”和“G”列时。我不处理 d9$G>2000000,因为列 'G' 的值不应大于 2 mil
    • 您的一系列 if 语句首先检查 d9$R 列中的值,然后测试 d9$Y 列中的值,最后检查 d9$G 列中的值。所以是的,您需要在d9$R 列中输入一些值,然后才能显示黄色或绿色。如果您想要不同的行为,您需要重新考虑您的测试逻辑。并且列'G'的值不应该大于2 mil并不意味着用户不会尝试输入这么高的值(这会破坏应用程序)。
    • 即使在为绿色设置了默认值之后,一旦我进行了编辑,它们都会消失。在编辑“R”后,我尝试对“Y”和“G”进行多次编辑,但只有红色出现,而绿色和黄色没有。在我在这里实现合并之前,事情正在按预期工作(来自查询的列+来自 R 的列):stackoverflow.com/questions/68834742/…
    • 是的,当然,这又是由于您的 if 语句。尝试输入 R = 2000000, Y = 2100000 和 G = 1,你会得到一些绿色。尝试 R = 2000000, Y = 1 和 G = 1 得到一些黄色。您从未在以前的版本中提供过您的测试数据(“cmp.rds”),因此我们无法猜测它之前“按预期”工作的原因和方式。我必须自己创建一个包含一些 RGB 值的文件,它的工作原理与这个新版本完全一样。
    • 很难使用嵌套的ifelse 获得所需的结果,方法是在每列中保留值或 NA(即未输入值)。 ifelse 语句的一个很好的替代方法是来自 dplyr 包的 case_when() 函数,用于忽略 NA 值。查看我的编辑。
    猜你喜欢
    • 2018-04-13
    • 1970-01-01
    • 2019-07-07
    • 2019-09-05
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-31
    相关资源
    最近更新 更多