如何将无引号字符参数列表传入apply/map/pmap实现批量中介分析
问题原因
你编写的causal_med_so函数使用了tidyverse的非标准评估语法({{}}、enquo),设计上是直接传入未加引号的列名/对象名使用的,而你生成的param_list里所有参数都是字符串类型,直接传给函数会被识别为字面量字符串,无法对应到数据框的列和环境中的数据集,所以会触发类型报错。
方案1:无需修改原函数,调用时做参数转换
用purrr::pmap遍历参数组合,把每个字符串参数转为符号后注入函数调用即可正常运行:
- 先修正参数列表的
data字段,不要传字符串"mtcars",直接用列表包裹数据集对象避免展开:
library(purrr) param_list <- list( predictor = c("mpg", "cyl"), mediator = c("drat", "disp", "wt", "cyl"), outcome = c("qsec", "gear", "carb", "hp"), data = list(mtcars) ) %>% cross()
- 调用时用符号注入语法把字符串转为列名:
all_results <- pmap(param_list, function(predictor, mediator, outcome, data) { causal_med_so( predictor = !!sym(predictor), mediator = !!sym(mediator), outcome = !!sym(outcome), data = data ) })
运行结束后all_results就是所有参数组合对应的模型结果列表,可按索引提取单个结果,也可以用bind_rows等工具批量整理输出。
方案2:修改原函数直接适配字符串输入
如果后续经常需要批量传字符串调用,可以直接把函数改成支持字符串参数的版本,后续调用不用每次做符号转换:
causal_med_str <- function(predictor, mediator, outcome, data, ...){ if(!missing(...)) { covars <- c(...) data <- data %>% dplyr::select(all_of(c(predictor, mediator, outcome, covars))) %>% dplyr::filter(across(.cols = everything(), .fns = ~ !is.na(.))) med.form <- formula(paste0( mediator, "~", predictor, "+", paste0(covars, collapse = "+") )) med.fit <- lm(med.form, data = data) out.form <- formula(paste0( outcome, "~", predictor, "+", mediator, "+", paste0(covars, collapse = "+") )) out.fit <- lm(out.form, data = data) } else { data <- data %>% dplyr::select(all_of(c(predictor, mediator, outcome))) %>% dplyr::filter(across(.cols = everything(), .fns = ~ !is.na(.))) med.form <- formula(paste0(mediator, "~", predictor)) med.fit <- lm(med.form, data = data) out.form <- formula(paste0(outcome, "~", predictor, "+", mediator)) out.fit <- lm(out.form, data = data) } med.out <- mediation::mediate(med.fit, out.fit, treat = predictor, mediator = mediator, boot=T, boot.ci.type = "bca") return(med.out) }
修改后可以直接用你生成的原参数列表调用:
all_results <- pmap(param_list, function(predictor, mediator, outcome, data) { causal_med_str(predictor, mediator, outcome, data = get(data)) })
注意事项
- 批量运行前建议先过滤掉参数组合里predictor和mediator重复的项(比如示例中predictor为
cyl、mediator也为cyl的组合运行会报错) boot=T时运行速度较慢,批量跑数前可以先设为boot=F测试逻辑是否通顺,确认无误后再开启bootstrap计算置信区间。
内容的提问来源于stack exchange,提问作者Raoul Duke
相关产品推荐
相关产品推荐

