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

如何将无引号字符参数列表传入apply/map/pmap实现批量中介分析

问题原因

你编写的causal_med_so函数使用了tidyverse的非标准评估语法({{}}、enquo),设计上是直接传入未加引号的列名/对象名使用的,而你生成的param_list里所有参数都是字符串类型,直接传给函数会被识别为字面量字符串,无法对应到数据框的列和环境中的数据集,所以会触发类型报错。


方案1:无需修改原函数,调用时做参数转换

用purrr::pmap遍历参数组合,把每个字符串参数转为符号后注入函数调用即可正常运行:

  1. 先修正参数列表的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()
  1. 调用时用符号注入语法把字符串转为列名:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 14:06:03