如何通过tbl_survfit传递公式对象?R语言ggsurvfit报错排查
动态传递公式给
survfit2()和tbl_survfit()的报错解决 问题背景
想要编写函数动态创建公式对象,传递给ggsurvfit::survfit2()后再传入tbl_survfit(),方便调用函数或配合purrr::map()修改公式部分,但直接传递公式对象或调用自定义函数时出现报错,报错信息包括! x must be a formula和unexpected end of input。
报错原因
survfit2()参数传递逻辑:survfit2()依赖非标准求值处理公式,直接通过管道传递预先生成的公式对象时,会被错误识别为非第一个参数,导致函数无法正确解析公式。- 自定义函数逻辑错误:原
myfun()的条件判断写反,当strata不为空时反而生成无分层公式;且strata为空时拼接出Surv(ttdeath, death) ~这种语法无效的公式,触发解析错误。 - 非标准求值冲突:直接传递预先生成的公式对象时,未遵循
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
相关产品推荐
相关产品推荐

