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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 18:54:04