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
相关产品推荐
相关产品推荐

