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

如何在Shiny仪表盘侧边栏添加两个基于RNAType列的下拉选择框

解决Shiny仪表盘添加双类型miRNA下拉框的问题

没问题,我来帮你实现这个需求!你需要在侧边栏添加两个独立的下拉选择框,分别对应RNAType列中的MicroRNA和snRNA,每个下拉框只展示对应类型的miRNA选项,对吧?下面是修改后的完整代码,我会给你拆解关键改动点:

关键改动说明

  • 拆分下拉框选项:原来的下拉框包含所有miRNA,现在我们分别过滤出RNAType为MicroRNA和snRNA的miRNA唯一值,作为两个下拉框的选项,确保选项和类型严格对应。
  • 新增类型选择控件:添加了一个单选按钮组,让用户可以切换要分析的RNA类型,这样程序能知道该读取哪个下拉框的输入。
  • 更新反应式数据逻辑:调整了data_selected函数,根据用户选择的RNA类型,动态过滤出对应的miRNA数据,保证绘图数据的准确性。
  • 修复数据类型问题:原数据中的TimeDiff、Status和value是字符型,直接用于生存分析会报错,所以在绘图前转换成了数值型。

修改后的完整代码

library(survival)
library(survminer)
library(dplyr) # 需要加载dplyr来使用filter和mutate函数

df.t <- structure(list(miRNA = c("hsa-let-7f-3p", "hsa-let-7d-3p", "hsa-let-7c-3p", "hsa-let-7g-3p", "hsa-let-7g-3p", "hsa-let-7i-3p"), RNAType = c("MicroRNA", "MicroRNA", "MicroRNA", "snRNA", "snRNA", "snRNA"), Status = c("1", "0", "1", "1", "1", "1"), TimeDiff = c("213", "1313", "2442", "1313", "1212", "2213"), value = c("10.3", "4", "3", "2.4", "5.4", "4.3")), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame" ))

ui.miRNA <- dashboardPage(
  dashboardHeader(title=h4(HTML("Plot"))),
  dashboardSidebar(
    # 第一个下拉框:仅显示MicroRNA类型的miRNA
    selectInput("microRNA_select", "MicroRNA", choices = unique(df.t$miRNA[df.t$RNAType == "MicroRNA"])),
    # 第二个下拉框:仅显示snRNA类型的miRNA
    selectInput("snRNA_select", "snRNA", choices = unique(df.t$miRNA[df.t$RNAType == "snRNA"])),
    # 单选按钮:选择要分析的RNA类型
    radioButtons("rna_type", "选择分析类型", choices = c("MicroRNA", "snRNA"), selected = "MicroRNA")
  ),
  dashboardBody(
    sliderInput("obs", "Quantiles", min = 0, max = 1, value = c(0.4, 0.8) ),
    tabsetPanel(
      tabPanel("Plot", plotOutput("myplot", width = "400px", height = "300px"))
    )
  )
)

server <- function(input, output, session) {
  data_selected <- reactive({
    # 先确认用户选择了RNA类型
    req(input$rna_type)
    
    if(input$rna_type == "MicroRNA"){
      # 确认MicroRNA下拉框有选择
      req(input$microRNA_select)
      # 过滤出对应MicroRNA和类型的数据
      filter(df.t, miRNA == input$microRNA_select, RNAType == "MicroRNA")
    } else {
      # 确认snRNA下拉框有选择
      req(input$snRNA_select)
      # 过滤出对应snRNA和类型的数据
      filter(df.t, miRNA == input$snRNA_select, RNAType == "snRNA")
    }
  })
  
  output$myplot <- renderPlot({
    lower_value <- input$obs[1]
    upper_value <- input$obs[2]
    
    # 确保反应式数据已加载
    req(data_selected())
    
    # 转换数据类型为数值型,避免生存分析报错
    plot_data <- data_selected() %>%
      mutate(TimeDiff = as.numeric(TimeDiff),
             Status = as.numeric(Status),
             value = as.numeric(value))
    
    fitSurv <- survfit(Surv(TimeDiff, Status) ~ cut(value, quantile(value, probs = c(0, lower_value, upper_value)), include.lowest=TRUE),data = plot_data)
    
    ggsurvplot(fitSurv, data = plot_data)
  } )
}

# 运行Shiny应用
shinyApp(ui = ui.miRNA, server = server)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:51:14