R Shiny如何通过下拉菜单选ID后渲染对应timevis时间线?
问题修复方案
核心问题梳理
- 语法错误:构建时间线数据框时,
content参数末尾使用了中文逗号,导致代码无法正常解析 - 输入ID冲突:所有标签页的输入控件ID需全局唯一,原代码中3个下拉选框都用了
person作为ID,会触发渲染异常 - 无动态关联逻辑:原时间线渲染逻辑为静态写死,未和用户选择的ID关联,无法实现切换效果
完整可运行代码
library(shiny) library(shinythemes) library(timevis) ui <- fluidPage(theme = shinytheme("superhero"), navbarPage("Timeline", tabPanel("Single Selection", sidebarPanel( # 下拉选框扩展多个可选ID,取值和后续数据列表的命名对应 selectInput("selected_person", "Person:", c("123" = "p1", "234" = "p2", "345" = "p3")), ), mainPanel( timevisOutput("p1_tl") ) ), tabPanel("Comparison", sidebarPanel( # 修改为唯一ID,避免冲突 selectInput("person1", "Person 1:", c("123" = "p1", "234" = "p2", "345" = "p3")), selectInput("person2", "Person 2:", c("123" = "p1", "234" = "p2", "345" = "p3")), ), mainPanel( h1("Under construction") ) ) ) ) server <- function(input, output) { # 提前存储所有人员的时间线数据,命名和下拉选框取值对应 person_tl_data <- list( p1 = list( data = data.frame( start = c("2016", "2017", "2017", "2018"), end = c(NA, "2018", NA, "2019"), content = c("Item 1", "Item 2A", "Item 2B", "Item 3"), group = c(1, 2, 2, 3) ), groups = data.frame(id = 1:3, content = c("Group 1", "Group 2", "Group 3")) ), p2 = list( data = data.frame( start = c("2015", "2017", "2019"), end = c("2016", "2018", NA), content = c("P2 Item1", "P2 Item2", "P2 Item3"), group = c(1, 2, 3) ), groups = data.frame(id = 1:3, content = c("P2 G1", "P2 G2", "P2 G3")) ), p3 = list( data = data.frame( start = c("2017", "2018", "2020"), end = c("2019", NA, "2021"), content = c("P3 Item1", "P3 Item2", "P3 Item3"), group = c(1, 1, 2) ), groups = data.frame(id = 1:2, content = c("P3 G1", "P3 G2")) ) ) output$p1_tl <- renderTimevis ({ # 根据用户选择的ID取对应的数据 selected_data <- person_tl_data[[input$selected_person]] timevis(data = selected_data$data, groups = selected_data$groups) }) } shinyApp(ui, server)
逻辑说明
提前将所有ID对应的时间线数据存入命名列表,列表命名和下拉选框的取值一一对应,当用户切换下拉选框的选项时,input$selected_person取值更新会自动触发renderTimevis重新运行,拉取对应人员的时间线数据完成渲染,即可实现切换不同ID展示对应时间线的需求。
内容的提问来源于stack exchange,提问作者lyg0526
相关产品推荐
相关产品推荐

