Shiny应用问题:选择不同miRNA时生存图无法更新
解决Shiny应用中选择不同miRNA时生存图不更新的问题
我看到你在Shiny应用里遇到了选择不同miRNA时生存图不更新的问题,咱们来一步步解决它。你的代码里有两个核心问题导致了这个现象,下面我会详细说明并给出修正后的完整代码:
问题分析
生存模型结果未正确赋值
在renderPlot函数中,你运行了survfit()但没有将结果赋值给fitSurv变量,这就导致后续ggsurvplot(fitSurv)找不到这个对象,自然无法生成对应miRNA的生存图。小样本下的分位数分组问题
你的示例数据只有5个样本,使用quantile(value, probs = c(0, .4, .8))会产生重复的分位数(比如某些分位点数值相同),导致cut()无法生成有效的分组,这也会影响生存图的正常生成。
修正后的完整代码
library(dplyr) require(survminer) library(tidyverse) require(reshape2) library(shiny) library(tidyr) require(survival) # 示例数据 df.miRNA.cpm <- structure(list(`86` = c(5.57979757386892, 17.0240095264258, 4.28380151026145, 13.0457611762755, 12.5531123449841), `175` = c(5.21619202802748, 15.2849097474841, 2.46719979911461, 10.879496005461, 9.66416497290915 ), `217` = c(5.42796072966512, 17.1413407297933, 5.15230233060323, 12.2646127361351, 12.1031024927547), `394` = c(-1.1390337316217, 15.1021660424984, 4.63168157763046, 11.1299079134792, 9.55572588729967 ), `444` = c(5.06134249676025, 14.5442494311861, -0.399445049232868, 7.45775961504073, 9.92629675808998)), row.names = c("hsa_let_7a_3p", "hsa_let_7a_5p", "hsa_let_7b_3p", "hsa_let_7b_5p", "hsa_let_7c_5p" ), class = "data.frame") df.miRNA.cpm$miRNA <- rownames(df.miRNA.cpm) ss.survival.shiny.miRNA.miRNA <- structure(list(ID = c("86", "175", "217", "394", "444"), TimeDiff = c(71.0416666666667, 601.958333333333, 1130, 1393, 117.041666666667), Status = c(1L, 1L, 0L, 0L, 1L)), row.names = c(NA, 5L), class = "data.frame") # 合并数据框 data_prep.miRNA <- df.miRNA.cpm %>% tidyr::pivot_longer(-miRNA, names_to = "ID") %>% left_join(ss.survival.shiny.miRNA.miRNA) # Shiny应用 ui.miRNA <- fluidPage( selectInput("MicroRNA", "miRNA", choices = unique(data_prep.miRNA$miRNA)), plotOutput("myplot") ) server <- function(input, output, session) { data_selected <- reactive({ filter(data_prep.miRNA, miRNA %in% input$MicroRNA) }) output$myplot <- renderPlot({ # 1. 将survfit结果赋值给fitSurv变量 # 2. 处理分位数重复问题:用unique确保分位数不重复,改用中位数分组更适合小样本 fitSurv <- survfit( Surv(TimeDiff, Status) ~ cut(value, unique(quantile(value, probs = c(0, 0.5, 1))), include.lowest=TRUE), data = data_selected() ) # 生成生存图并返回,显式传入data参数确保关联正确 ggsurvplot(fitSurv, data = data_selected()) }) } shinyApp(ui.miRNA, server)
关键修改说明
- 赋值生存模型结果:明确将
survfit()的结果赋值给fitSurv,让ggsurvplot可以调用这个模型对象。 - 优化分组逻辑:改用中位数(
probs = c(0, 0.5, 1))进行分组,同时用unique()处理可能的重复分位数,确保在小样本下也能生成有效的高低表达组。 - 补充ggsurvplot的data参数:显式传入
data = data_selected(),确保绘图时能正确关联当前选中的miRNA数据。
现在运行修正后的代码,选择不同的miRNA就能看到对应的生存图更新啦!
内容的提问来源于stack exchange,提问作者user2300940
相关产品推荐
相关产品推荐

