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

如何通过tbl_survfit传递公式对象?R语言ggsurvfit报错排查

动态传递公式给survfit2()和tbl_survfit()的报错解决

问题背景

想要编写函数动态创建公式对象,传递给ggsurvfit::survfit2()后再传入tbl_survfit(),方便调用函数或配合purrr::map()修改公式部分,但直接传递公式对象或调用自定义函数时出现报错,报错信息包括! x must be a formula和unexpected end of input。

报错原因

  1. survfit2()参数传递逻辑:survfit2()依赖非标准求值处理公式,直接通过管道传递预先生成的公式对象时,会被错误识别为非第一个参数,导致函数无法正确解析公式。
  2. 自定义函数逻辑错误:原myfun()的条件判断写反,当strata不为空时反而生成无分层公式;且strata为空时拼接出Surv(ttdeath, death) ~ 这种语法无效的公式,触发解析错误。
  3. 非标准求值冲突:直接传递预先生成的公式对象时,未遵循survfit2()的参数传递规则,导致函数无法识别输入为公式类型。

修正方案与代码

1. 正确传递预先生成的公式对象

可以通过明确指定formula参数或使用do.call()来规避非标准求值的问题:

# 加载包
library(gtsummary)
library(ggsurvfit)

# 预先生成公式对象
formula_obj <- as.formula("Surv(ttdeath, death) ~ 1")

# 方式1:明确指定formula参数调用survfit2
survfit2(formula = formula_obj, data = trial) %>% 
  tbl_survfit(probs = 0.5)

# 方式2:使用do.call传递参数
do.call(survfit2, list(formula = formula_obj, data = trial)) %>% 
  tbl_survfit(probs = 0.5)

2. 修正自定义函数

调整条件判断逻辑,确保公式拼接正确,并明确指定formula参数:

myfun <- function(strata = NULL){
  if(is.null(strata)){
    # 无分层时的公式
    formula <- as.formula("Surv(ttdeath, death) ~ 1")
  } else {
    # 有分层时拼接合法公式
    formula_str <- paste0("Surv(ttdeath, death) ~ ", strata)
    formula <- as.formula(formula_str)
  }
  # 明确指定formula参数,避免非标准求值问题
  survfit2(formula = formula, data = trial) %>% 
    tbl_survfit(probs = 0.5)
}

# 调用无分层参数
myfun()

# 调用有分层参数
myfun(strata = "trt")

修正说明

  • 反转原函数的条件判断逻辑,确保分层参数的正确使用。
  • 调用survfit2()时明确指定formula参数,让函数正确识别预先生成的公式对象。
  • 避免生成语法无效的公式字符串,确保公式解析正常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 16:25:13