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

R语言自定义Cox函数如何适配ggadjustedcurves正常运行

问题根因
  • 你用as.name()将传入的分组列名转为了R语言符号对象,但ggadjustedcurves()的variable入参仅接受字符串格式的列名,传入符号对象时无法匹配数据集里的对应列,会直接报错。
  • 拟合Cox模型时未设置model = TRUE,survminer包在提取模型关联的数据集时会出现索引失败。
  • 你贴出的自定义函数末尾缺失闭合大括号,存在基础语法错误。
修复后完整代码
library(survival)
library(survminer)

myfun <- function(TimeVar, EventVar, CoxVar, CoxData){
  # 留存字符串格式的分组列名,供ggadjustedcurves调用
  target_var <- CoxVar
  # 转换为符号对象,供非标准传参拟合Cox模型使用
  TimeVar <- as.name(TimeVar)
  EventVar <- as.name(EventVar)
  CoxVar_sym <- as.name(CoxVar)
  
  # 拟合Cox模型时增加model=TRUE参数,留存模型框架数据
  CoxModel <- eval(bquote(
    coxph(Surv(.(TimeVar), .(EventVar)) ~ .(CoxVar_sym),
          data = .(CoxData),
          model = TRUE)
  ))
  
  # 绘制调整生存曲线,variable参数传入字符串格式列名
  g_plot <- ggadjustedcurves(CoxModel,
                             variable = target_var,
                             xlab = "Years",
                             ylab = "Survival",
                             ggtheme = theme_survminer(),
                             size = 2,
                             palette = "lancet",
                             data = CoxData)
  
  # 显式返回图像对象
  return(g_plot)
}

# 调用测试(以survival包内置lung数据集为例)
# myfun(TimeVar = "time", EventVar = "status", CoxVar = "sex", CoxData = lung)
适配裸列名输入的修改方案

如果你希望函数支持直接输入不带引号的裸列名(非标准调用格式),只需要把入参处理部分替换为如下代码即可,其余逻辑不变:

myfun <- function(TimeVar, EventVar, CoxVar, CoxData){
  # 捕获裸列名入参,分别转成符号和字符串格式
  TimeVar <- substitute(TimeVar)
  EventVar <- substitute(EventVar)
  CoxVar_sym <- substitute(CoxVar)
  target_var <- as.character(CoxVar_sym)
  
  # 后续Cox模型拟合、绘图逻辑和上述版本完全一致
}
# 测试调用(无需给列名加引号)
# myfun(TimeVar = time, EventVar = status, CoxVar = sex, CoxData = lung)

内容的提问来源于stack exchange,提问作者AkuaMJ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 14:30:57