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

如何在Shiny中存储toastUI日历预订数据及解决删除异常问题

解决toastUI日历在Shiny网球场预订系统中的两个问题

1. 将预订数据存储至DataFrame

要持久化存储预订数据,可通过Shiny的reactiveValues维护动态更新的DataFrame,具体操作如下:

  • 初始化reactiveValues对象,创建包含日程核心字段(id、title、start、end等)的空DataFrame
  • 新增日程时,为每条记录生成唯一ID,将数据追加到DataFrame
  • 更新日程时,通过ID匹配并修改DataFrame中的对应记录
  • 删除日程时,移除DataFrame中对应ID的记录

2. 修复弹窗编辑后日程无法删除的问题

弹窗编辑后无法删除的核心原因是新增日程未分配唯一ID,导致编辑后的日程缺失识别标识,cal_proxy_delete无法匹配到目标日程。解决时需确保所有日程(包括手动新增的)都带有唯一ID,且更新操作中保留该ID。


修改后的完整代码

library(shiny)
library(toastui)
library(uuid) # 用于生成唯一ID,也可用paste0("sch_", Sys.time())等方式替代

ui <- fluidPage(  
  titlePanel("Buchungssystem"),
  tabsetPanel(
    tabPanel("Platz 1",
             calendarOutput("tennis1"),
             # 可选:添加输出查看存储的DataFrame,方便调试
             verbatimTextOutput("schedule_data")
             ),
    )
)

server <- function(input, output) {
  # 初始化响应式存储,保存日程数据
  rv <- reactiveValues(
    schedules = data.frame(
      id = character(),
      title = character(),
      start = character(),
      end = character(),
      stringsAsFactors = FALSE
    )
  )
  
  output$tennis1 <- renderCalendar({
    calendar(
      isReadOnly = FALSE,
      scheduleView = "time",
      defaultDate = Sys.Date(),
      view = "week",
      navigation = TRUE,
      navOpts = navigation_options(
        today_label = "heute", 
        prev_label = "Woche zurück", 
        next_label = "Woche vor", 
        fmt_date = "DD/MM/YYYY", 
        sep_date = " - "
      ),
      useDetailPopup = TRUE,
      useCreationPopup = TRUE,
      # 加载已存储的日程
      schedules = rv$schedules
    ) %>%
      cal_week_options(
        startDayOfWeek = 1, 
        daynames = c("So","Mo","Di","Mi","Do","Fr","Sa"),
        hourStart = 7,
        hourEnd = 21
      )
  })
  
  # 处理新增日程
  observeEvent(input$tennis1_add, {
    new_schedule <- input$tennis1_add
    # 生成唯一ID
    new_schedule$id <- UUIDgenerate()
    # 添加到存储的DataFrame
    rv$schedules <- rbind(rv$schedules, new_schedule)
    # 更新日历显示
    cal_proxy_add("tennis1", new_schedule)
  })    
  
  # 处理更新日程
  observeEvent(input$tennis1_update, {
    updated_schedule <- input$tennis1_update
    # 找到对应ID的记录并更新
    rv$schedules[rv$schedules$id == updated_schedule$id, ] <- updated_schedule
    # 更新日历显示
    cal_proxy_update("tennis1", updated_schedule)
  })   
  
  # 处理删除日程
  observeEvent(input$tennis1_delete, {
    deleted_id <- input$tennis1_delete$id
    # 从存储的DataFrame中移除
    rv$schedules <- rv$schedules[rv$schedules$id != deleted_id, ]
    # 更新日历显示
    cal_proxy_delete("tennis1", input$tennis1_delete)
  })   
  
  # 可选:输出存储的日程数据用于调试
  output$schedule_data <- renderPrint({
    rv$schedules
  })
}

shinyApp(ui = ui, server = server)

关键说明

  1. 数据存储:reactiveValues中的DataFrame可实时响应数据变化,确保预订记录持久化
  2. 唯一ID:通过uuid包生成全局唯一ID,避免重复;也可使用简单的时间戳拼接方式替代
  3. 删除修复:新增日程时分配ID后,弹窗编辑会保留该ID,删除事件可通过ID准确匹配目标日程,解决无法删除的问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 06:18:21