Shiny应用如何实现selectInput切换多个输出表格?
问题修复方案
原代码核心问题
- 表格渲染逻辑被包裹在未被调用的
reactive()函数中,对应代码永远不会触发执行 - 重复定义
renderDataTable属于冗余写法,不符合Shiny响应式编程规范 - 缺失启动Shiny应用的
shinyApp(ui, server)调用,代码无法直接运行
修复后可直接运行代码
注意:如果你的运行环境中已经预先定义好了data_2022和roty_2022两个数据框,可以删除代码中构造示例数据的部分。
award_types <- c("MVP", "ROTY") # 示例数据构造开始 data_2022 <- data.frame(球员 = c("尼古拉·约基奇", "扬尼斯·阿德托昆博", "乔尔·恩比德"), 得票率 = c("87.5%", "62.3%", "51.2%")) roty_2022 <- data.frame(球员 = c("斯科蒂·巴恩斯", "埃文·莫布利", "凯德·坎宁安"), 得票率 = c("48.2%", "47.8%", "3.1%")) # 示例数据构造结束 library(shiny) ui <- pageWithSidebar( headerPanel("NBA Awards Tracker"), sidebarPanel(selectInput("Awards", "Choose an Award", choices = award_types, selected = "MVP")), mainPanel(dataTableOutput("Table")) ) server <- function(input, output) { output$Table <- renderDataTable({ if(input$Awards == "MVP") { return(data_2022) } else { return(roty_2022) } }) } shinyApp(ui, server)
优化写法(适合后续新增奖项)
用映射表替代多层条件判断,后续新增奖项只需要更新award_data_map列表即可:
server <- function(input, output) { award_data_map <- list( "MVP" = data_2022, "ROTY" = roty_2022 ) output$Table <- renderDataTable({ award_data_map[[input$Awards]] }) }
内容的提问来源于stack exchange,提问作者EliMTZ
相关产品推荐
相关产品推荐

