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

Shiny应用问题:选择不同miRNA时生存图无法更新

解决Shiny应用中选择不同miRNA时生存图不更新的问题

我看到你在Shiny应用里遇到了选择不同miRNA时生存图不更新的问题,咱们来一步步解决它。你的代码里有两个核心问题导致了这个现象,下面我会详细说明并给出修正后的完整代码:

问题分析

  1. 生存模型结果未正确赋值
    在renderPlot函数中,你运行了survfit()但没有将结果赋值给fitSurv变量,这就导致后续ggsurvplot(fitSurv)找不到这个对象,自然无法生成对应miRNA的生存图。

  2. 小样本下的分位数分组问题
    你的示例数据只有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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 11:47:54