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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 06:06:04