Shiny Plotly应用过滤器后无法主动渲染时间序列折线图问题求助
问题根源
你的代码主要存在4个核心错误:
- reactive响应式对象不需要挂载到
output上,直接定义为普通变量即可,你写的output$df2 <- reactive(...)会导致后续调用df2()找不到对象 - 复选框
input$covid返回的是布尔值TRUE/FALSE,不是字符串"Covid",你的判断条件完全写错了 - 响应式数据
df2没有写else分支,不勾选排除新冠周期时会返回空值 - 下拉框默认选中为
"Select",此时没有有效变量传入绘图逻辑,会触发报错
修正后完整代码
请确认flexdashboard头部配置了runtime: shiny,完整可运行代码如下:
--- title: "时间序列可视化" output: flexdashboard::flex_dashboard runtime: shiny --- ```{r setup, include=FALSE} library(tidyverse) library(plotly) library(flexdashboard) library(shiny) # 构造示例数据 df <- data.frame(Date = rev(seq(as.Date("2020-01-01"), as.Date("2021-08-15"),"day")), Var1 = sample(10:100, 593, replace = TRUE), Var2 = sample(10:100, 593, replace = TRUE), Var3 = sample(10:100, 593, replace = TRUE), Var4 = sample(10:100, 593, replace = TRUE) ) df$CovidPeriod <- ifelse((df$Date>=as.Date("2020-03-01", format="%Y-%m-%d") & df$Date<=as.Date("2020-09-30", format="%Y-%m-%d")), "Covid", "NonCovid")
可视化面板
控件区域
selectInput("Series1", label = "选择展示变量:", choices = c("Var1", "Var2", "Var3", "Var4"), selected = "Var1") checkboxInput("covid", "排除2020年3-9月新冠疫情周期数据?", value = FALSE)
折线图区域
# 定义响应式数据集 df2 <- reactive({ if(input$covid){ filter(df, CovidPeriod == "NonCovid") } else { df } }) renderPlotly({ target_var <- input$Series1 plot_ly(df2(), x = ~Date, y = ~.data[[target_var]], type='scatter', mode = 'lines', name = '实际值', line=list(color='rgb(56, 98, 249)', width=4)) %>% layout(title = paste0(target_var, "时间序列趋势"), xaxis = list(title = "日期"), yaxis = list(title = target_var) ) })
--- ### 修改说明 - 去掉了下拉框里无效的`"Select"`选项,默认选中Var1,避免无有效变量的报错 - 修正了响应式数据集的定义方式,不需要挂载到output,同时补充了else分支返回全量数据 - 修正了复选框的判断逻辑,直接判断`input$covid`的布尔值即可 - 绘图时用`.data[[target_var]]`的标准写法调用动态变量,避免公式语法报错 - 动态修改了图表标题和Y轴标题,和选中的变量自动匹配 内容的提问来源于stack exchange,提问作者LeMarque
相关产品推荐
相关产品推荐

