Shiny R中DT组件删除行后更新及按钮自定义问题
解决方案:更新DT表格并自定义按钮文本
我帮你调整了代码,解决了这两个问题——删除选中行后自动刷新表格,同时自定义了Delete按钮的样式和DT内置按钮的文本。下面是修改后的完整代码:
library(shiny) library(DT) library(dplyr) library(readr) # 加载readr包,避免read_csv2报错 shinyApp( ui <- fluidPage( DT::dataTableOutput("ruless"), fluidRow( column( 4, offset = 1, # 自定义Delete按钮为红色样式,可按需调整 actionButton("delete", "Delete", width = 200, class = "btn btn-danger") ) ) ), server <- function(input, output) { values <- reactiveValues(data = NULL) # 给初始数据添加列名,方便后续操作 values$data <- as.data.frame( cbind( c("a", "d", "b", "c", "e", "f"), c(1463, 159, 54, 52, 52, 220), c(0.7315, 0.0795, 0.027, 0.026, 0.026, 0.11) ), col.names = c("Col1", "Col2", "Col3") ) shinyInput = function(FUN, len, id, ...) { inputs = character(len) for (i in seq_len(len)) { inputs[i] = as.character(FUN(paste0(id, i), label = NULL, ...)) } inputs } output$ruless <- DT::renderDataTable({ datatable( data.frame(delete = shinyInput(checkboxInput, nrow(values$data), "cbox_"), values$data), selection = "multiple", escape = FALSE, filter = list(position = 'top', clear = FALSE), extensions = list("ColReorder" = NULL, "Buttons" = NULL), options = list( dom = 'BRrltpi', autoWidth = TRUE, lengthMenu = list(c(10, 50, -1), c('10条', '50条', '全部')), # 自定义长度菜单文本 ColReorder = TRUE, preDrawCallback = JS('function() { Shiny.unbindAll(this.api().table().node()); }'), drawCallback = JS('function() { Shiny.bindAll(this.api().table().node()); } '), buttons = list( # 重命名复制按钮 list(extend = 'copy', text = '复制'), # 重命名打印按钮 list(extend = 'print', text = '打印'), list( extend = 'collection', buttons = list( list(extend = 'csv', text = '导出CSV'), list(extend = 'excel', text = '导出Excel'), list(extend = 'pdf', text = '导出PDF') ), text = '导出数据', # 重命名导出集合按钮文本 selected = TRUE ) ) ) ) }) shinyValue = function(id, len) { unlist(lapply(seq_len(len), function(i) { value = input[[paste0(id, i)]] if (is.null(value)) NA else value })) } observeEvent(input$delete, { checkbox_rules <- data.frame(selected = shinyValue("cbox_", nrow(values$data))) marked_rules <- values$data[which(checkbox_rules$selected == TRUE), ] # 写入删除文件的逻辑保持不变 if (file.exists("delete_file.csv")){ delete_file <- read_csv2("delete_file.csv", col_names = TRUE) delete_file <- rbind(delete_file, marked_rules) delete_file <- delete_file[!duplicated(delete_file), ] write.csv2(delete_file, file = "delete_file.csv", sep = ";", row.names = FALSE) } else{ write.csv2(marked_rules, file = "delete_file.csv", sep = ";", row.names = FALSE) } # 核心改动:移除选中行,更新响应式数据 values$data <- values$data[which(checkbox_rules$selected != TRUE), ] }) } )
关键改动说明
1. 实现删除后自动更新表格
在点击Delete按钮的逻辑里,我添加了一行代码:
values$data <- values$data[which(checkbox_rules$selected != TRUE), ]
这行代码会把被选中的行从values$data中移除。因为renderDataTable依赖values$data这个响应式对象,当它发生变化时,DT会自动重新渲染页面,这样就看不到已删除的行啦。
2. 自定义按钮样式与文本
- Delete按钮:给
actionButton添加了class = "btn btn-danger",让按钮变成醒目的红色。如果需要更个性化的样式,你可以用style参数直接写CSS,比如style = "background-color: #ff6666; border: none; color: white;"。 - DT内置按钮:把原来的字符串形式按钮(比如
'copy')改成了列表形式,通过text参数自定义显示文本,比如把copy改成"复制",print改成"打印",导出集合里的按钮也一一设置了自定义文本,你可以根据需求改成任意内容。
另外,我还给初始数据添加了列名,让后续操作更清晰;同时确保加载了readr包,避免运行时因read_csv2未定义报错。
内容的提问来源于stack exchange,提问作者tomsu
相关产品推荐
相关产品推荐

