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

结合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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 23:36:01