You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:06:41