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
相关产品推荐
相关产品推荐

