如何在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
相关产品推荐
相关产品推荐

