如何在Shiny应用中记录actionButton标签并生成指定结构CSV文件
实现方案
修改说明
- 修复UI重复ID问题:将navlistPanel的ID改为
nav_tab,两个标签页下的按钮分别添加bet1_、bet2_前缀避免ID冲突 - 新增响应式变量存储用户两页的选择结果
- 为每个按钮绑定点击事件:Bet1页点击后自动存储选择值并跳转至Bet2页
- Bet2页完成选择后自动生成符合要求的CSV文件,保存到工作目录的
responses文件夹下 - 优化数据保存逻辑,自动创建存储目录(如果不存在)
完整可运行代码
library(shiny) library(shinyjs) outputDir <- "responses" # 自动创建存储目录 if (!dir.exists(outputDir)) dir.create(outputDir) saveData <- function(mydata, namedata){ fileName=paste0(paste(namedata,as.integer(Sys.time()),sep="_"),".csv") # 保存路径改为工作目录下的responses文件夹 filePath <- file.path(outputDir, fileName) write.csv(mydata, filePath, row.names = FALSE, quote = TRUE) } ui <- fluidPage( id="main", title="Risk and ambiguity", useShinyjs(), navlistPanel(id="nav_tab", tabPanel("Bet1", fluidRow(column(12, align='center', hr("Choisissez urne A, urne B ou un sac avec A et B:"))), fluidRow(wellPanel( splitLayout(cellWidths = c("33%", "33%", "33%"), column(12,align="center",actionButton("bet1_act1", label = "Je choisis option A")), column(12,align="center",actionButton("bet1_act2", label = "Je choisis le sac avec A et B")), column(12,align="center",actionButton("bet1_act3", label = "Je choisis option B"))) ))), tabPanel("Bet2", fluidRow(column(12, align='center', hr("Choisissez urne A, urne B ou un sac avec A et B:"))), fluidRow(wellPanel( splitLayout(cellWidths = c("33%", "33%", "33%"), column(12,align="center",actionButton("bet2_act1", label = "Je choisis option A")), column(12,align="center",actionButton("bet2_act2", label = "Je choisis le sac avec A et B")), column(12,align="center",actionButton("bet2_act3", label = "Je choisis option B"))) ))) )) server <- function(input, output, session) { # 存储选择结果的响应式变量 rv <- reactiveValues( bet1_choice = NULL, bet2_choice = NULL ) # 监听Bet1页的按钮点击 observeEvent(input$bet1_act1, { rv$bet1_choice <- "Je choisis option A" updateTabsetPanel(session, "nav_tab", selected = "Bet2") }) observeEvent(input$bet1_act2, { rv$bet1_choice <- "Je choisis le sac avec A et B" updateTabsetPanel(session, "nav_tab", selected = "Bet2") }) observeEvent(input$bet1_act3, { rv$bet1_choice <- "Je choisis option B" updateTabsetPanel(session, "nav_tab", selected = "Bet2") }) # 监听Bet2页的按钮点击,完成后保存数据 save_result <- function(choice) { rv$bet2_choice <- choice res_df <- data.frame( Bet1 = rv$bet1_choice, Bet2 = rv$bet2_choice ) saveData(res_df, "bet_selection") } observeEvent(input$bet2_act1, save_result("Je choisis option A")) observeEvent(input$bet2_act2, save_result("Je choisis le sac avec A et B")) observeEvent(input$bet2_act3, save_result("Je choisis option B")) } shinyApp(ui = ui, server = server)
内容的提问来源于stack exchange,提问作者firmo23
相关产品推荐
相关产品推荐

