结合tidy selection使用survival包出现promise already under evaluation错误如何解决
问题原因
survival包的公式解析使用base R原生的非标准评估逻辑,不兼容tidy evaluation的{{ }}插值语法。你直接在Surv()内写{{.time}}时,survfit解析公式时会直接去搜索名为.time的变量,而非你传入的dtime,自然会抛出对象未找到的错误。
修复方案
方案1:基于tidy evaluation实现(保留无引号传参习惯)
你只需要先捕获用户传入的变量表达式,再注入到公式中即可,修改后的代码如下:
# 需提前加载rlang(tidyverse系列包默认已加载) library(rlang) library(survival) get_survfit <- function(.data, .time){ # 捕获用户传入的时间变量表达式 .time_quo <- enquo(.time) # 动态构建Surv公式 surv_formula <- inject(Surv(!!.time_quo, status) ~ 1) return(survival::survfit(formula = surv_formula, data = .data)) }
测试调用代码和你原有的写法完全一致:
data(cancer) colnames(rotterdam)[colnames(rotterdam) == "death"] <- "status" # 无需给dtime加引号,符合你要保留的调用习惯 fit <- get_survfit(.data = rotterdam, .time = dtime) # 验证输出 fit
方案2:base R原生实现(无需额外依赖)
如果不想依赖rlang,也可以用base R的表达式操作实现相同效果:
get_survfit <- function(.data, .time){ .time_expr <- substitute(.time) surv_formula <- reformulate("1", response = bquote(Surv(.(.time_expr), status))) return(survival::survfit(formula = surv_formula, data = .data)) }
内容的提问来源于stack exchange,提问作者Lukas D. Sauer
相关产品推荐
相关产品推荐

