Shiny中实现可编辑Budget列,点击更新自动计算mrA/mrB列
解决方案
以下是改造后的代码,实现了Budget列可编辑、点击更新按钮重新计算mrA和mrB的功能:
library(DT) library(shiny) library(tidyverse) initial_budget = tibble(country = c('us', 'fr', 'de'), budget = c(100, 200, 300)) ui <- fluidPage( actionButton("update_btn", "更新计算结果"), br(), br(), DT::dataTableOutput('allocated') ) server <- function(input, output) { # 用reactiveValues存储可修改的表格数据,保持会话状态 budget_data <- reactiveValues(df = initial_budget %>% mutate(mrA = budget * 0.25, mrB = budget * 0.75)) # 监听表格单元格编辑事件,仅更新Budget列的值 observeEvent(input$allocated_cell_edit, { edit_info <- input$allocated_cell_edit target_row <- edit_info$row target_col <- edit_info$col new_value <- edit_info$value # 仅允许修改第2列(Budget列) if(target_col == 2){ budget_data$df[target_row, target_col] <- as.numeric(new_value) } }) # 监听更新按钮,重新计算mrA和mrB observeEvent(input$update_btn, { budget_data$df <- budget_data$df %>% mutate(mrA = budget * 0.25, mrB = budget * 0.75) }) # 渲染可编辑的DataTable output$allocated = DT::renderDataTable({ datatable( budget_data$df, # 配置可编辑规则:仅允许单元格编辑,禁用第1、3、4列的编辑权限 editable = list(target = 'cell', disable = list(columns = c(1,3,4))), options = list( columnDefs = list( # 给Budget列添加可编辑样式标记 list(targets = 2, className = 'editable') ) ) ) }) } shinyApp(ui = ui, server = server)
关键改动说明
- UI层:新增
actionButton作为计算触发按钮,用户修改Budget后点击即可更新结果。 - 状态管理:使用
reactiveValues存储表格数据,替代静态初始数据,确保修改后的数据能在会话中保留。 - 编辑权限控制:通过
editable参数指定仅Budget列可编辑,避免用户误改其他计算列或国家名称列。 - 编辑事件监听:捕获用户的单元格编辑操作,仅当编辑的是Budget列时更新数据,同时将输入值转为数值类型保证计算正确性。
- 计算触发逻辑:点击更新按钮时,重新执行
mrA = budget * 0.25和mrB = budget * 0.75的计算逻辑,更新表格中的结果列。
内容的提问来源于stack exchange,提问作者Fisseha Berhane
相关产品推荐
相关产品推荐

