R Shiny使用DateSlider动态过滤ggplot2图表报错如何解决?
错误原因
- 核心报错是代码里引用了不存在的输入变量
input$start_dt、input$end_dt,两个值为NULL,导致filter条件长度为0触发报错 - 混淆了reactive对象的调用规则:reactive定义的
nt_data调用时必须加括号写成nt_data() - 输出ID不匹配:UI里的图表输出ID是
ntsplot,调整后写的output$ntplot和UI不绑定,不会生效 - 控件类型不匹配:你用的是单值
sliderInput,但过滤逻辑是时间区间,要么把slider改成范围选择模式,要么替换为dateRangeInput - 初始值冲突:
selectizeInput默认值是"Names",如果你的产品列表里没有该值,首次加载时过滤结果为空也会触发报错
修正方案
首先调整UI部分的日期控件为范围选择模式,匹配你的区间过滤逻辑:
sidebarLayout(position = "left", sidebarPanel( selectizeInput("productid", "Select product", choices = NULL), # 初始为空,由observe更新 # 修改sliderInput为范围选择模式,value设为起始、结束两个值 sliderInput("dateid", "Slide your Date:", min = as.Date(date_range$start_dt,"%Y-%m-%d"), max = as.Date(date_range$end_dt,"%Y-%m-%d"), value= c(as.Date(date_range$start_dt,"%Y-%m-%d"), as.Date(date_range$asofdate,"%Y-%m-%d")), timeFormat="%Y-%m-%d") ), mainPanel( fluidRow( splitLayout(cellWidths = c("50%", "50%"), plotOutput("ntsplot"), plotOutput("")) ) ) )
再修正server部分的逻辑:
server <- function(input, output,session) { # 优先更新下拉选项,避免初始值不存在的问题,默认选中第一个产品 observe({ updateSelectizeInput(session,"productid",choices = prod_dim$prod_nm, selected = prod_dim$prod_nm[1]) }) nt_data <- reactive({ # 加req判断输入值有效才执行后续逻辑,避免空值报错 req(input$productid, input$dateid) chart_nts <- perf_ind %>% # 用input$dateid的两个值作为时间区间 filter(product %in% input$productid & (week_end >= input$dateid[1] & week_end <= input$dateid[2])) %>% group_by(week_end,product) %>% summarise(c_nts = sum(nts), .groups = "drop") }) output$ntsplot <- renderPlot({ # 确认数据有效再绘图,避免空数据报错 req(nt_data()) g <- ggplot(nt_data(),aes(y= c_nts, x = week_end)) # 已经按周汇总过,用stat="identity"直接取值即可,不需要再次sum g + geom_bar(stat = "identity") }) }
内容的提问来源于stack exchange,提问作者Tpk43
相关产品推荐
相关产品推荐

