编辑其他 DT 列值时不显示颜色值,它基于 R 闪亮



我有一个列'R/Y/G',它应该根据R、Y和G三个不同列的值包含Green、Yellow或Red三种颜色。条件是,如果列'R'的值大于250万,则'R/Y/G'中相应单元格的颜色为Red。如果列'Y'的值在2到2.5 mil之间,则'R/Y/G'中相应单元格的颜色为黄色。如果列'G'的值小于2mil,则'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'的颜色将取决于我在'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')

})

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

创建的空列是字符类型而不是数字类型,因此您必须像这样创建数字类型的空列:

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

学习如何通过插入断点来检查对象/列的类型来调试Shiny应用程序。

顺便说一下,当d9$G > 2000000.

编辑:如果你需要在用户输入任何值之前显示一些默认颜色,你应该为tcolor列设置一些默认值,例如:
d9['tcolor'] <- 1

为了得到你想要的级联条件的行为,而不是被NA值所困扰(当列中没有输入值时),你可以使用dplyr包中的case_when()函数(见这篇文章):

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

相关内容

  • 没有找到相关文章

最新更新