Shiny应用点击actionButton向本地存储CSV文件新增列实现问题
Shiny按钮点击逐列新增数据写入CSV实现方案
原代码存在以下明显问题:
- UI仅定义了3个功能按钮,服务端却额外监听了15个不存在的按钮,逻辑完全不匹配需求
- reactiveValues初始化时重复定义了col3,后续数据拼接时还把Bet5列错误命名为Bet4
- 原逻辑是按轮次绑定按钮组,和「任意按钮每点击1次新增1列,最多累计6次」的要求完全不符
修正后可直接运行的代码
library(shiny) library(shinyjs) library(DT) ui <- fluidPage( id="main", title="风险与模糊性", useShinyjs(), fluidRow( column(12, align='center', hr("请选择A瓮、B瓮或包含A和B的袋子:") ) ), DTOutput("t1"), fluidRow( wellPanel( splitLayout(cellWidths = c("33%", "33%", "33%"), column(12,align="center",actionButton("opt_a", label = "Je choisis option A")), column(12,align="center",actionButton("opt_ab", label = "Je choisis le sac avec A et B")), column(12,align="center",actionButton("opt_b", label = "Je choisis option B")) ) ) ) ) server <- function(input, output, session){ # 响应式变量:记录累计点击次数、最终存储的数据框 rv <- reactiveValues( click_count = 0, result_df = data.frame() ) # 按钮和对应文本的映射 btn_map <- list( "opt_a" = "Je choisis option A", "opt_ab" = "Je choisis le sac avec A et B", "opt_b" = "Je choisis option B" ) # 统一监听三个按钮的点击事件 lapply(names(btn_map), function(btn_id){ observeEvent(input[[btn_id]], { # 最多允许6次点击 if(rv$click_count >=6) return() rv$click_count <- rv$click_count + 1 # 新增列 new_col_name <- paste0("Bet", rv$click_count) rv$result_df[[new_col_name]] <- btn_map[[btn_id]] # 写入CSV write.csv(rv$result_df, file = "solution.csv", row.names = F) # 满6次点击后禁用所有按钮 if(rv$click_count ==6){ lapply(names(btn_map), function(id) disable(id)) } }) }) # 页面实时展示当前写入的数据 output$t1 <- renderDT({ rv$result_df }) } shinyApp(ui = ui, server = server)
功能说明
- 每次点击任意按钮,会自动新增一列
BetX(X从1到6),列值为点击按钮的对应文本 - 累计点击满6次后按钮会自动禁用,避免超量操作
- 每次点击后会自动将最新数据写入工作目录下的
solution.csv,和要求的输出格式完全一致
内容的提问来源于stack exchange,提问作者firmo23
相关产品推荐
相关产品推荐

