Shiny中reactive函数内ggsurvplot的pval参数数值输入报错排查
触发原因
ggsurvplot的pval参数对输入类型有严格的分支校验:如果传入逻辑值会自动计算p值,如果传入字符类型才会识别为自定义显示文本。你代码中p_val经round(as.numeric(p_val),2)处理后为数值类型,即使通过paste拼接为字符串,部分版本的survminer仍会溯源变量类型,误触发自动计算p值的逻辑分支,最终因类型不匹配报错。- 代码中非必要的
eval(parse(text=...))动态解析写法,会进一步放大参数类型识别的异常,导致函数无法正确判断你传入的pval为自定义文本。
修复方案
方案1:强制转换为字符类型(改动最小)
取消你代码中p_val = as.character(p_val)行的注释即可,修改后代码段如下:
p_val = surv_pvalue(fit, data = surv_gene, method = "1") p_val = round(as.numeric(p_val),2) p_val = as.character(p_val) # 强制转换为字符类型
转换后paste("P =", p_val)的输出为纯字符类型,符合自定义文本的参数要求。
方案2:优化代码逻辑(推荐,提升健壮性)
删除非必要的动态解析代码,直接传递survfit对象,避免类型识别异常:
# 替换原有fit和ggsurv_doc的动态创建代码 fit <- survfit(Surv(OS, event) ~ group, data = surv_gene) p_val <- round(as.numeric(surv_pvalue(fit, method = "1")), 2) ggsurvplot(fit, # 直接传入fit对象,无需重复创建 data = surv_gene, conf.int = F, censor = T, palette = c("#DC143C", "#4071B3"), legend.title = colnames(surv_gene)[3], pval = paste0("P = ", as.character(p_val)), legend.labs=c("High", "Low"), surv.median.line = "hv", break.time.by = 12, xlab = "Time (months)")
内容的提问来源于stack exchange,提问作者tuanzi
相关产品推荐
相关产品推荐

