Shiny应用reset按钮显示、位置调整及重置异常问题求助
Shiny应用问题修复方案
问题原因与修复思路
- 需求1不生效原因:
req(input$date2)写在observeEvent(input$reset)中仅会在按钮点击时做校验,无法控制按钮本身的显隐。修复方案使用shinyjs包的toggle方法,根据日期选择状态动态控制按钮显示。 - 需求2实现方案:在原有
sidebarPanel内新增独立的wellPanel容器放置reset按钮,即可实现分层的侧边栏面板效果。 - 下拉选单报错原因:重置操作将
date2设为NA后,output$mycode的req(input$date2)触发会直接移除下拉选单组件,此时再调用updateSelectInput更新不存在的组件就会抛出异常。修复方案删除reset事件中冗余的updateSelectInput调用即可。
修复后可运行完整代码
library(shiny) library(shinythemes) library(shinyjs) library(dplyr) # 示例绘图函数 f1 <- function(data, date, code) { filter_data <- data %>% filter(date2 == as.Date(date), Category == code) plot(filter_data$date2, filter_data$value, main = paste0("日期:", date, " 分类:", code), xlab = "日期", ylab = "数值") } ui <- navbarPage(theme = shinytheme("flatly"), collapsible = TRUE, br(), tabPanel("", sidebarLayout( sidebarPanel( useShinyjs(), # 原有控件所在面板 wellPanel( uiOutput("date"), uiOutput("mycode") ), # reset按钮独立面板 wellPanel( actionButton("reset", "Reset") ), br() ), mainPanel( tabsetPanel( tabPanel("", plotOutput("graph",width = "100%", height = "600") ) ) )) )) server <- function(input, output,session) { # 补全示例数据,可替换为你的function.test() data <- reactive({ data.frame( date2 = seq(as.Date('2021-01-01'), as.Date('2021-01-15'), by = "day"), Category = sample(c("分类A","分类B","分类C"), 15, replace = T), value = rnorm(15, 10, 2) ) }) output$date <- renderUI({ req(data()) all_dates <- seq(as.Date('2021-01-01'), as.Date('2021-01-15'), by = "day") disabled <- as.Date(setdiff(all_dates, as.Date(data()$date2)), origin = "1970-01-01") dateInput(input = "date2", label = h4("Data"), min = min(data()$date2), max = max(data()$date2), value = min(data()$date2), format = "dd-mm-yyyy", datesdisabled = disabled) }) output$mycode <- renderUI({ req(input$date2) df1 <- data() df2 <- df1[as.Date(df1$date2) %in% input$date2,] selectInput("code", label = h4("Category"),choices=unique(df2$Category)) }) my <- reactiveValues(plot=NULL) output$graph <- renderPlot({ req(input$date2,input$code) if (!is.null(input$date2) & !is.null(input$code)) { my$plot <- f1(data(),as.character(input$date2),as.character(input$code)) }else { my$plot <- NULL } my$plot }) # 动态控制reset按钮显隐 observe({ toggle("reset", condition = !is.null(input$date2)) }) observeEvent(input$reset, { req(input$date2) my$plot <- NULL updateDateInput(session, 'date2', value = NA) }) } shinyApp(ui = ui, server = server)
内容的提问来源于stack exchange,提问作者Antonio
相关产品推荐
相关产品推荐

