Shiny中renderPlot调用响应式子集数据报错:部分列找不到
梦幻橄榄球Shiny应用错误排查与修复
核心错误根源
- subset函数逻辑错误:在响应式数据筛选中,分类变量(位置/球员/球队)的判断用了
=(赋值符号)而非==(比较符号),且多选场景下必须用%in%而非==,这会直接导致筛选失效,甚至引发数据框列丢失。 - 数据清理遗漏赋值:数据处理阶段
FantFootDF[!is.na(FantFootDF$FantPos),]未将过滤后的结果赋值回原数据框,空值行残留可能引发后续列名异常。 - ggplot冗余数据传递:绘图时重复在
ggplot()和geom_point()中传入数据源,虽不直接报错,但会增加不必要的计算开销。
修正后的关键代码片段
1. 数据清理修正
# 原代码未赋值,修正后保留非空位置的行 FantFootDF <- FantFootDF[!is.na(FantFootDF$FantPos),]
2. 响应式数据筛选修正
df <- reactive({ subset(FinalDF, FantPos %in% input$position, Player %in% input$playername, Team %in% input$team, Age >= input$age[1] & Age <= input$age[2], Cmp >= input$completions[1] & Cmp <= input$completions[2], PAtt >= input$Pattempts[1] & PAtt <= input$Pattempts[2], PYds >= input$Pyards[1] & PYds <= input$Pyards[2], PTD >= input$Ptds[1] & PTD <= input$Ptds[2], RuYA >= input$RuYperA[1] & RuYA <= input$RuYperA[2], RuAtt >= input$RuAttempts[1] & RuAtt <= input$RuAttempts[2], RuYds >= input$RuYards[1] & RuYds <= input$RuYards[2], RuTD >= input$RuTDs[1] & RuTD <= input$RuTDs[2], Rec >= input$rec[1] & Rec <= input$rec[2], ReYds >= input$ReYards[1] & ReYds <= input$ReYards[2], ReYA >= input$ReYperA[1] & ReYA <= input$ReYperA[2], ReTD >= input$ReTDs[1] & ReTD <= input$ReTDs[2], Fmb >= input$fumb[1] & Fmb <= input$fumb[2], PPR >= input$ppr[1] & PPR <= input$ppr[2] ) })
3. ggplot绘图代码简化
output$plot1 <- renderPlot({ # 统一设置基础图层,避免重复代码 p <- ggplot(data = df(), aes(y = PPR, color = FantPos)) + ggtitle("PPR Points") + ylab("PPR Points") # 根据选择切换x轴变量 if(input$plottype == "PPR by Player"){ p + geom_point(aes(x = Player)) + xlab("Player") } else if(input$plottype == "PPR by Team"){ p + geom_point(aes(x = Team)) + xlab("Team") } else if(input$plottype == "PPR by Age"){ p + geom_point(aes(x = Age)) + xlab("Age") } })
额外优化建议
- 为pickerInput设置默认选中值,避免初始状态无筛选数据:比如
selected = unique(FinalDF$FantPos) - 补充表格输出的响应式代码,方便验证筛选结果:
output$table <- renderTable({ df() })
内容的提问来源于stack exchange,提问作者Davis Cotton
相关产品推荐
相关产品推荐

