自定义KM曲线函数报错求助(R语言ovarian数据集)
自定义KM曲线函数调试问题及解决方案
我正尝试编写自定义KM曲线函数,但始终无法正常运行。已改用公开的ovarian数据集测试,先后尝试多种写法均失败,具体错误及排查如下:
1. 第一种写法:参数传递失败
代码
library(tidyverse) library(ggplot2) # 注:原代码误写为ggplot,正确包名为ggplot2 library(survival) library(survminer) km_curve <- function(df, tm, ev, predictor) { surv_object <- Surv(time = df$tm, event = df$ev) fit1 <- survfit(surv_object ~ predictor, data = df) ggsurvplot(fit1, data = df, pval = TRUE, xlab = "Months") }
错误原因
df$tm是直接提取列名为tm的列,而非参数tm对应的目标列;survfit(surv_object ~ predictor)将predictor作为字面量变量名,而非传入的预测列名。
2. 第二种写法:公式解析错误
代码
km_curve <- function(df, tm, ev, predictor) { surv_object <- Surv(time = df[,tm], event = df[,ev]) fit1 <- survfit(surv_object ~ predictor, data = df) ggsurvplot(fit1, data = df, pval = TRUE, xlab = "Months") }
错误原因
df[,tm]仅在tm为字符型列名时有效,若传入裸变量名(如futime)会报错;- 公式部分仍未解决
predictor的动态引用问题。
3. 第三种写法:数据类型不匹配+变量解析错误
代码
km_curve <- function(df, tm, ev, predictor) { tim <- df %>% select(tm) even <- df %>% select(ev) surv_object <- Surv(time = tim, event = even) fit1 <- survfit(surv_object ~ predictor, data = df) ggsurvplot(fit1, data = df, pval = TRUE, xlab = "Months") } km_curve(df = ovarian, tm = futime, ev = fustat, predictor = rx)
错误原因
select(tm)返回数据框,而Surv要求输入向量,应改用pull()提取列向量;- 未使用tidy eval语法捕获裸变量名,导致
select(tm)无法识别传入的列; - 公式部分的
predictor引用问题仍存在。
4. 第四种写法:公式错误+参数误用
代码
library(tidyverse) library(survival) library(survminer) ovarian km_graph<-function(t, e, var, df, xaxis = "Months"){ surv_object <- Surv(time = t, event =e) fit1<- survfit(surv_object ~ var, data = df) kmgraph<-ggsurvplot(fit1, data = df, pval = TRUE, xaxis = "Months", risk.table = T) kmgraph$table <- ggrisktable(fit1, data = df, color = "strata", y.text = T, ylab = "", xlab = "", tables.theme = theme_cleantable(), ) return(kmgraph) } km_graph(t = ovarian$futime, e =ovarian$fustat, var = rx, df = ovarian)
错误原因
survfit(surv_object ~ var)将var作为字面量,而非传入的rx列;ggsurvplot没有xaxis参数,正确参数为xlab;- 调用时
var = rx未在函数内正确解析为数据框的列。
解决方案
推荐两种写法,分别适配tidyverse风格和基础R风格:
方案1:Tidy Eval风格(支持裸变量名传入)
library(tidyverse) library(survival) library(survminer) km_curve <- function(df, tm, ev, predictor) { # 提取向量并构建Surv对象 surv_object <- Surv(time = df %>% pull({{tm}}), event = df %>% pull({{ev}})) # 动态构建生存分析公式 fit_formula <- reformulate(rlang::as_name(enquo(predictor)), response = "surv_object") fit1 <- survfit(fit_formula, data = df) # 生成KM曲线及风险表 ggsurvplot(fit1, data = df, pval = TRUE, xlab = "Months", risk.table = TRUE) } # 调用示例 km_curve(df = ovarian, tm = futime, ev = fustat, predictor = rx)
{{tm}}/{{ev}}:tidy eval语法,捕获传入的裸变量名并映射到数据框列;reformulate:动态构建公式,将预测变量转为公式右侧项。
方案2:字符型参数风格(支持列名字符串传入)
km_curve_char <- function(df, tm, ev, predictor) { # 提取向量构建Surv对象 surv_object <- Surv(time = df[[tm]], event = df[[ev]]) # 字符串拼接生成公式 fit_formula <- as.formula(paste0("surv_object ~ ", predictor)) fit1 <- survfit(fit_formula, data = df) ggsurvplot(fit1, data = df, pval = TRUE, xlab = "Months", risk.table = TRUE) } # 调用示例 km_curve_char(df = ovarian, tm = "futime", ev = "fustat", predictor = "rx")
内容的提问来源于stack exchange,提问作者franklin ross
相关产品推荐
相关产品推荐

