Shiny上传Excel生成可编辑DT表格实现total列自动计算的问题
R Shiny可编辑DT表格联动计算修复方案
你提供的代码无法触发自动计算的核心原因如下:
- 事件监听ID不匹配:DT表格的输出ID为
contents,对应的单元格编辑触发事件应为input$contents_cell_edit,原代码监听了不存在的input$final_tbl_cell_edit,编辑动作无法触发计算逻辑 - 响应式对象赋值错误:
reactiveValues的属性赋值无需使用全局赋值符<<-,直接使用<-即可维持响应式链路正常触发 - 依赖包缺失:代码用到了
dplyr的管道、mutate等函数,未显式加载该包会导致部分环境下运行报错
修正后的完整代码如下:
library(shiny) library(DT) library(readxl) library(dplyr) # 补充缺失的依赖包 server <- function(input, output, session){ df1 <- reactiveValues(data=NULL) myData <- reactive({ inFile <- input$TT if(is.null(inFile)) return(NULL) file.rename(inFile$datapath, paste0(inFile$datapath, ".xlsx")) df_TT_raw <- read_excel(paste0(inFile$datapath, ".xlsx"), 1) df_TT <- df_TT_raw %>% mutate(across(where(is.numeric), round, digits=2)) %>% # 替换已弃用的mutate_if写法,兼容性更好 mutate(total = bb + cc) df_TT }) observe({ df1$data <- myData() }) output$contents <- DT::renderDataTable({ req(df1$data) # 增加非空判断避免初始加载报错 DT::datatable(df1$data, editable = TRUE) }) # 修正为对应表格ID的编辑监听事件 observeEvent(input$contents_cell_edit, { info = input$contents_cell_edit i = info$row j = info$col v = info$value df1$data[i, j] <- DT::coerceValue(v, df1$data[i, j]) df1$data$total <- df1$data$bb + df1$data$cc }) } ui <- shinyUI(fluidPage( titlePanel("上传文件联动计算"), sidebarLayout( sidebarPanel( fileInput(inputId = "TT", label = "上传Excel文件", accept = c(".xlsx",".csv") ) ), mainPanel( DT::dataTableOutput('contents') ) ) )) shinyApp(ui,server)
内容的提问来源于stack exchange,提问作者Reza AM
相关产品推荐
相关产品推荐

