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

Shiny App报错Error in force(ui): object 'ui' not found 排查

报错根因

最直接触发Error in force(ui) : object 'ui' not found的原因是:定义UI界面时,上场时间滑块的max参数直接调用了未绑定数据框的独立对象MP,R在执行ui <- fluidPage(...)代码时直接报错中断,ui对象根本没有被成功创建,后续启动应用时自然找不到可用的ui对象。除此之外代码里还存在多处ID不匹配、函数错配、语法逻辑错误,就算修复了ui创建问题也无法正常运行。

全量错误点清单
  • 上场时间滑块最大值未指定数据来源:直接写max(MP),MP是Player_Stats数据框的字段,单独调用不存在
  • 渲染函数错配:plotly交互图表使用了基础的plotOutput做输出占位,必须替换为plotlyOutput才能正常渲染交互内容
  • 输入ID不匹配:球队复选框定义的inputId是tm_input,但数据筛选逻辑里写的是input$Tm_,ID完全不匹配导致筛选失效
  • 字段名写错:二分球命中率被重命名为TwoP%,但第二张图的悬浮提示里引用的是不存在的`2P%`字段
  • reactive对象调用错误:Player_Stats.subset是响应式对象,渲染表格时必须加括号Player_Stats.subset()才能拿到筛选后的数据,直接传对象本身无法渲染
  • ggplotly调用顺序错误:正确逻辑是先构建ggplot绘图对象,再把对象传入ggplotly()转成交互图,原代码写反了管道顺序,无法正常生成图表
  • 滑块配置不合理:原滑块是单值阈值筛选,初始值设为0,不符合区间筛选的常规使用需求
修正后可直接运行的代码
library(shiny)
library(ggplot2)
library(dplyr)
library(plotly)
library(tidyverse)

# 读取本地数据,替换为你自己的文件存储路径即可
Player_Stats<-read.csv("2021-2022 Indiv Per Game Stats.csv")
colnames(Player_Stats)[11]<-"FG%"
colnames(Player_Stats)[14]<-"ThreeP%"
colnames(Player_Stats)[17]<-"TwoP%"
colnames(Player_Stats)[18]<-"eFG%"
colnames(Player_Stats)[21]<-"FT%"

ui<-fluidPage(
  titlePanel("NBA 2022赛季球员场均数据查询"),
  sidebarLayout(
    sidebarPanel(
      sliderInput("input1",
                  "场均上场时间(分钟)",
                  min=0,
                  max = max(Player_Stats$MP, na.rm = T),
                  value = c(0, max(Player_Stats$MP, na.rm = T))),
      sliderInput("Input2",
                  "出场次数",
                  min = 0,
                  max = 82,
                  value = c(0,82)),
      checkboxGroupInput(inputId = "tm_input",
                         label = "所属球队",
                         choices = unique(Player_Stats$Tm),
                         selected = unique(Player_Stats$Tm))
    ),
    mainPanel(
      plotlyOutput("plot1"),
      plotlyOutput("plot2"),
      dataTableOutput("Player_StatsTable")
    )
  )
)

server<-function(input, output){
  # 响应式数据筛选
  Player_Stats.subset=reactive({
    Player_Stats %>% 
      dplyr::filter(Tm %in% input$tm_input) %>%
      dplyr::filter(MP >= input$input1[1], MP <= input$input1[2]) %>% 
      dplyr::filter(G >= input$Input2[1], G <= input$Input2[2])
  })
  
  # 得分-三分命中率交互图
  output$plot1<-renderPlotly({
    p1 <- Player_Stats.subset() %>% 
      ggplot(aes(x=PTS, y=`ThreeP%`,color=Tm, 
                 text=paste("球员:",Player, "<br>场均得分:",PTS, "<br>三分命中率%:", round(`ThreeP%`*100,1), "<br>球队:",Tm)))+
      geom_point(alpha=0.7)+
      geom_smooth(se=F, method = "lm")+
      xlab("场均得分")+
      ylab("三分命中率")+
      ggtitle("球员场均得分与三分命中率分布")+
      theme_bw()+
      theme(plot.title = element_text(hjust = 0.5), legend.position = "none")
    ggplotly(p1, tooltip = "text")
  })
  
  # 得分-两分命中率交互图
  output$plot2<-renderPlotly({
    p2 <- Player_Stats.subset() %>% 
      ggplot(aes(x=PTS, y=`TwoP%`,color=Tm, 
                 text=paste("球员:",Player, "<br>场均得分:",PTS, "<br>两分命中率%:", round(`TwoP%`*100,1), "<br>球队:",Tm)))+
      geom_point(alpha=0.7)+
      geom_smooth(se=F, method = "lm")+
      xlab("场均得分")+
      ylab("两分命中率")+
      ggtitle("球员场均得分与两分命中率分布")+
      theme_bw()+
      theme(plot.title = element_text(hjust = 0.5), legend.position = "none")
    ggplotly(p2, tooltip = "text")
  })
  
  # 数据表格输出
  output$Player_StatsTable<-renderDataTable({
    Player_Stats.subset()
  })
}
shinyApp(ui=ui,server=server)
额外优化点
  • 滑块改为双端区间选择,支持自定义筛选上下限,比单阈值筛选更贴合分析需求
  • 悬浮提示增加HTML换行,命中率做1位小数四舍五入,避免长小数显示混乱
  • 散点增加透明度,减少点重叠遮挡问题,拟合曲线默认隐藏冗余图例、去掉置信区间,图表可读性更强
  • 所有最大值计算加na.rm=T参数,兼容数据中的空值,避免计算报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 02:57:08