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

自定义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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 11:47:43