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
相关产品推荐
相关产品推荐

