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

Shiny应用未勾选复选框时的错误提示及提交后消息展示问题

问题解决与代码优化建议

一、添加未勾选复选框的提示

将复选框的验证逻辑整合到InputValidator中,统一触发错误提示;也可配合模态框直观告知用户未勾选确认框的问题。

二、实现随机感谢消息的展示与存储

  1. 生成随机消息:提交验证通过后生成随机感谢语;
  2. 展示消息:用模态框弹出感谢内容反馈给用户;
  3. 存储消息:将感谢消息加入表单数据,同步保存到云端表格。

三、代码优化建议

  • 简化表单数据收集逻辑,用tibble替代繁琐的列表转数据框操作;
  • 为姓名字段添加必填验证,完善表单校验规则;
  • 给saveData函数增加异常捕获,避免云端存储失败导致应用崩溃;
  • 新增提交时间字段,便于后续数据回溯分析;
  • 提交成功后可重置表单,提升用户体验;
  • 移除未使用的loadData函数(若后续无需加载历史数据)。

修改后的完整代码

library(shiny)
library(googlesheets4)
library(shinyvalidate)
library(shinyFeedback)
library(tibble)

# 配置云端表格信息
SHEET_ID <- "### 替换为你的Google Sheet ID ###"
fields <- c("name", "email", "tick", "thank_message", "submit_time")

saveData <- function(data) {
  tryCatch({
    sheet_append(SHEET_ID, as.data.frame(data))
  }, error = function(e) {
    showModal(modalDialog(
      title = "存储失败",
      paste("数据保存出错:", e$message),
      footer = modalButton("关闭")
    ))
  })
}

shinyApp(
  ui = fluidPage(
    useShinyFeedback(),
    h3("模拟调查问卷"),
    textInput("name", "你的姓名:", ""),
    textInput("email", "你的邮箱地址:", ""),
    checkboxInput("tick", "我确认信息无误。", FALSE),
    actionButton("submit", "提交", class = "btn-primary")
  ),
  
  server = function(input, output, session) {
    
    # 收集表单数据
    formData <- reactive({
      tibble(
        name = input$name,
        email = input$email,
        tick = input$tick,
        submit_time = Sys.time()
      )
    })
    
    # 输入验证规则
    iv <- InputValidator$new()
    iv$add_rule("name", sv_required(message = "请输入姓名"))
    iv$add_rule("email", sv_email(message = "请输入有效的邮箱地址"))
    iv$add_rule("tick", sv_equal(TRUE, message = "请勾选确认框"))
    iv$enable()
    
    # 提交按钮逻辑
    observeEvent(input$submit, {
      if (iv$is_valid()) {
        # 生成随机感谢消息
        final_message <- sample(c('Many thanks!', 'Thanks!', 'Merci!'), 1)
        # 整合感谢消息到提交数据
        submit_data <- formData() %>% mutate(thank_message = final_message)
        # 保存数据到云端
        saveData(submit_data)
        
        # 展示感谢弹窗
        showModal(modalDialog(
          title = "提交成功",
          final_message,
          footer = modalButton("确定")
        ))
        
        # 提交后重置表单
        reset("name")
        reset("email")
        reset("tick")
      }
    })
    
    session$onSessionEnded(stopApp)
  }
)

内容的提问来源于stack exchange,提问作者Raphus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 04:05:33