单个R Shiny应用实现多变量散点图时提示未定义主面板报错求助
错误原因
- 第一个核心错误是
sidebarLayout的括号闭合错误:你在sidebarPanel结束后就提前关闭了sidebarLayout的括号,导致mainPanel没有被包含在sidebarLayout的参数范围内,系统识别不到布局对应的主面板组件。 - 第二个隐性错误是所有
ggplot代码只定义了映射关系,没有加几何图层函数geom_point(),即使修复布局问题也不会显示散点图。 - 第三个可优化问题:你写了7个重复的散点图渲染逻辑,完全可以通过侧边栏的选择器动态切换变量,不需要定义7个输出和7个标签页,代码冗余度太高。
修复后可直接运行的代码(兼容你原有的多标签页逻辑)
library(shiny) library(tidyverse) India <- read.csv("D:/R/Practice 3/Indiadata.csv") ui <- fluidPage( titlePanel("Deaths vs all variables "), # 修正sidebarLayout的括号,把mainPanel放到布局参数内 sidebarLayout( sidebarPanel( selectInput("Deaths", "All variables:", choices = c("cases"="total_cases","vaccinations"="total_vaccinations", "people vaccinated"="people_vaccinated","people fully vaccinated"="people_fully_vaccinated", "total booster"="total_boosters","new vaccinations"="new_vaccinations", "median age"="median_age")) ), # mainPanel现在是sidebarLayout的第二个参数 mainPanel( tabsetPanel(type = "tabs", tabPanel("病例", plotOutput("plot1")), tabPanel("总疫苗接种", plotOutput("plot2")), tabPanel("接种人数", plotOutput("plot3")), tabPanel("完全接种人数", plotOutput("plot4")), tabPanel("加强针总数", plotOutput("plot5")), tabPanel("新增接种", plotOutput("plot6")), tabPanel("年龄中位数", plotOutput("plot7")) ) ) ) ) server <- function(input, output) { # 每个ggplot补充geom_point图层,也可以根据需要加主题、配色等 output$plot1 <- renderPlot({ ggplot(India,aes(y=total_deaths,x=total_cases)) + geom_point() }) output$plot2 <- renderPlot({ ggplot(India,aes(y=total_deaths,x=total_vaccinations)) + geom_point() }) output$plot3 <- renderPlot({ ggplot(India,aes(y=total_deaths,x=people_vaccinated)) + geom_point() }) output$plot4 <- renderPlot({ ggplot(India,aes(y=total_deaths,x=people_fully_vaccinated)) + geom_point() }) output$plot5 <- renderPlot({ ggplot(India,aes(y=total_deaths,x=total_boosters)) + geom_point() }) output$plot6 <- renderPlot({ ggplot(India,aes(y=total_deaths,x=new_vaccinations)) + geom_point() }) output$plot7 <- renderPlot({ ggplot(India,aes(y=total_deaths,x=median_age)) + geom_point() }) } shinyApp(ui = ui, server = server)
更简洁的实现方案
如果不需要固定7个标签页,而是通过侧边栏选择直接切换展示的变量,可以把代码简化到只需要1个输出,大幅减少冗余:
library(shiny) library(tidyverse) India <- read.csv("D:/R/Practice 3/Indiadata.csv") ui <- fluidPage( titlePanel("Deaths vs all variables "), sidebarLayout( sidebarPanel( selectInput("x_var", "选择对比变量:", choices = c("cases"="total_cases","vaccinations"="total_vaccinations", "people vaccinated"="people_vaccinated","people fully vaccinated"="people_fully_vaccinated", "total booster"="total_boosters","new vaccinations"="new_vaccinations", "median age"="median_age")) ), mainPanel( plotOutput("scatter_plot") ) ) ) server <- function(input, output) { output$scatter_plot <- renderPlot({ # 用.data[[input$x_var]]动态读取选择的变量 ggplot(India,aes(y=total_deaths, x = .data[[input$x_var]])) + geom_point() + labs(x = names(which(attr(input$x_var, "names") == input$x_var))) # 显示变量的中文别名 }) } shinyApp(ui = ui, server = server)
内容的提问来源于stack exchange,提问作者Hari Chandana Bollimpalli
相关产品推荐
相关产品推荐

