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

Shiny中reactive函数内ggsurvplot的pval参数数值输入报错排查

触发原因

  1. ggsurvplot的pval参数对输入类型有严格的分支校验:如果传入逻辑值会自动计算p值,如果传入字符类型才会识别为自定义显示文本。你代码中p_val经round(as.numeric(p_val),2)处理后为数值类型,即使通过paste拼接为字符串,部分版本的survminer仍会溯源变量类型,误触发自动计算p值的逻辑分支,最终因类型不匹配报错。
  2. 代码中非必要的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 06:15:03