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

Shiny应用生成无数据空直方图,求排查问题原因

问题:Shiny应用直方图无数据显示

我编写的Shiny应用能正常启动,但生成的直方图为空无数据,数据DT为长格式(包含MinuteOfDay、variable、value字段),代码如下:

library(shiny)
library(magrittr)
library(ggplot2)

ui <- fluidPage(

    titlePanel("ABR Dashboard"),

    tabsetPanel(               
      
      tabPanel("Distribution",
               sidebarLayout(
                 selectInput(inputId = "Date", 
                             label = "Select Date", 
                             choices = seq.Date(lubridate::as_date(lubridate::now())-14, 
                                                lubridate::as_date(lubridate::now())-1, 
                                                by = "day")),
                 selectInput(inputId = "Metric",
                             label = "Which Metric",
                             choices = c("ABR_Actuals",
                                         "Abr_Preds",
                                         "Queue",
                                         "Login",
                                         "Tier"))
               ),
               
               mainPanel(
                 plotOutput("distPlot3")
               )
      )
    )
)

server <- function(input, output) {

      output$distPlot3 <- renderPlot({
        
      filtered_data <- reactive({
        dplyr::filter(DT, 
                      DT$MinuteOfDay %in% input$Date & 
                        DT$variable %in% input$Metric)
      })

      ggplot(filtered_data(),
             aes(x = variable)) +
             geom_histogram()
      
})

}

# Run the application 
shinyApp(ui = ui, server = server)

问题根源

  • 日期类型不匹配:input$Date是纯Date类型,但DT$MinuteOfDay是带时分秒的datetime格式,直接用%in%匹配会过滤掉所有数据。
  • 响应式表达式位置错误:filtered_data作为响应式数据,不能嵌套在renderPlot内部,无法正确响应输入变化。
  • 直方图映射逻辑错误:用x = variable做直方图,而用户每次只选一个指标,x轴只有单一类别,自然看不到有效分布。

修正后的代码

library(shiny)
library(magrittr)
library(ggplot2)
library(lubridate)
library(dplyr)

ui <- fluidPage(
    titlePanel("ABR Dashboard"),
    tabsetPanel(               
        tabPanel("Distribution",
                 sidebarLayout(
                     sidebarPanel(
                         selectInput(inputId = "Date", 
                                     label = "Select Date", 
                                     choices = seq.Date(as_date(now())-14, 
                                                        as_date(now())-1, 
                                                        by = "day")),
                         selectInput(inputId = "Metric",
                                     label = "Which Metric",
                                     choices = c("ABR_Actuals",
                                                 "Abr_Preds",
                                                 "Queue",
                                                 "Login",
                                                 "Tier"))
                     ),
                     mainPanel(
                         plotOutput("distPlot3")
                     )
                 )
        )
    )
)

server <- function(input, output) {
    # 将响应式数据移到renderPlot外部,符合Shiny规范
    filtered_data <- reactive({
        DT %>%
            # 提取datetime的日期部分,和输入日期匹配
            filter(as_date(MinuteOfDay) == input$Date,
                   variable == input$Metric) # 单一选项用==更高效
    })

    output$distPlot3 <- renderPlot({
        ggplot(filtered_data(),
               aes(x = value)) + # 映射数值列生成有效直方图
            geom_histogram(bins = 15, fill = "#2c3e50", alpha = 0.7) +
            labs(title = paste("Distribution of", input$Metric),
                 x = input$Metric,
                 y = "Count")
    })
}

# Run the application 
shinyApp(ui = ui, server = server)

关键修正说明

  • 日期匹配:用as_date(MinuteOfDay)提取日期部分,和input$Date做相等匹配,确保类型一致。
  • 响应式逻辑:把filtered_data移到renderPlot外部,保证输入变化时能实时更新数据。
  • 直方图映射:将x轴改为数据的数值列(假设为value,对应长格式数据的数值字段),生成有意义的分布直方图。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 11:01:13