如何在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)
关键说明
- 数据存储:
reactiveValues中的DataFrame可实时响应数据变化,确保预订记录持久化 - 唯一ID:通过
uuid包生成全局唯一ID,避免重复;也可使用简单的时间戳拼接方式替代 - 删除修复:新增日程时分配ID后,弹窗编辑会保留该ID,删除事件可通过ID准确匹配目标日程,解决无法删除的问题
内容的提问来源于stack exchange,提问作者konstantin
相关产品推荐
相关产品推荐

