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

Shiny中使用checkboxGroupInput筛选数据实现短信发送功能问题求解

问题定位
  • 响应式对象调用错误:你定义的data是Shiny的reactive响应式对象,使用时必须加括号写作data(),原代码中nrow(data)、data$Name均为错误写法,无法读取到实际生成的子集数据。
  • 变量作用域错误:completed变量不能定义在observeEvent外部,该变量需要在用户点击提交、选中数据生成后再计算,放在外部会在应用启动时就执行,此时还没有用户选择操作,无法得到正确结果。
  • 列名大小写不匹配:你的数据框中姓名字段为小写name,原代码中写为大写Name,无法匹配到对应列。
  • 应用启动语法错误:原代码中将ui、server的定义写在了第一个shinyApp()的参数中,末尾又重复调用了一次shinyApp(ui, server),语法结构错误会导致应用启动失败。
  • 缺少空选择校验:如果用户未勾选任何姓名直接点击提交,会因子集行数为0引发遍历逻辑报错,需要补充校验逻辑。
修正后可运行代码
library(shiny)
library(shinyforms)
library(readxl)
library(tidyverse)
library(shinyTime)
library(shinyalert)

# 基础数据
all_data=data.frame(name=c("name1", "name2", "name3", "name4"),
                    phone_number=c(11111111,22222222,33333333,44444444))

# 定义UI界面
ui <- fluidPage(
  titlePanel("Shiny App"),
  checkboxGroupInput('names', 'Names',
                     choices=all_data$name),
  useShinyalert(),
  actionButton("submit", "Submit")
)

# 定义服务端逻辑
server <- function(input, output, session) {
  # 响应式生成选中人员子集
  data <- reactive({
    df <- all_data[all_data$name %in% input$names,]
    return(df)
  })
  
  # 监听提交按钮点击
  observeEvent(input$submit, {
    # 校验是否选中人员,未选中则不执行后续逻辑
    req(length(input$names) > 0)
    
    # 遍历发送短信
    for(i in 1:nrow(data())){
      # 此处补充你的短信发送逻辑,可通过data()$phone_number[i]获取对应手机号
    }
    
    # 生成已发送名单
    completed <- paste(data()$name, collapse = ', ')
    # 弹出成功提醒
    shinyalert("Reminder Sent!", completed, type = "success")
  })
}

# 启动Shiny应用
shinyApp(ui, server)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 00:06:04