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

R自定义因果中介函数接收列表列参数调用pmap时报变量未找到错误

报错原因
  • 参数匹配逻辑问题:pmap会按列名匹配函数参数,你新增的covariates列表列会作为单个整体参数传入函数的...,而非把列表内的字符串拆分为多个独立参数。
  • 列选择规则冲突:dplyr::select默认采用非标准评估,你直接把字符向量形式的协变量通过...传入select时,不会被识别为列名,反而会尝试在环境中查找字符串对应的对象,最终抛出object 'vs' not found错误。
  • 冗余的非标准评估调用:原函数中对字符串参数反复做ensym→enquo→quo_name的转换,完全没有必要,额外增加了出错概率。
解决办法

直接修改函数定义,显式接收协变量参数,简化非必要的元编程逻辑,修改后的函数代码如下:

causal_med_so <- function(predictor, mediator, outcome, data, covariates = NULL){
  # 读取数据集
  df <- get(data, envir = .GlobalEnv) 
  
  # 筛选需要的列、去除缺失值,all_of适配字符向量形式的列名
  keep_cols <- c(predictor, mediator, outcome, covariates)
  df <- df %>%
    dplyr::select(all_of(keep_cols)) %>% 
    dplyr::filter(across(.cols = everything(), .fns = ~ !is.na(.)))
  
  # 拼接模型公式
  if (!is.null(covariates)) {
    cov_str <- paste(covariates, collapse = "+")
    med.form <- formula(paste0(mediator, "~", predictor, "+", cov_str))
    out.form <- formula(paste0(outcome, "~", predictor, "+", mediator, "+", cov_str))
  } else {
    med.form <- formula(paste0(mediator, "~", predictor))
    out.form <- formula(paste0(outcome, "~", predictor, "+", mediator))
  }
  
  # 拟合模型,不需要额外的eval、bquote调用
  med.fit <- lm(med.form, data = df)
  out.fit <- lm(out.form, data = df)
  
  # 执行中介效应分析
  med.out <- mediation::mediate(med.fit, out.fit,
                                treat = predictor,
                                mediator = mediator,
                                boot = TRUE, boot.ci.type = "bca")
  return(med.out)
}

修改完成后,你原来的参数构造和pmap调用逻辑不需要做任何调整,即可正常批量运行:

out <- param_dat %>%
  slice_head(n = 2) %>%
  pmap(., causal_med_so)

内容的提问来源于stack exchange,提问作者Raoul Duke

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 18:39:03