如何在R中编写函数,使传入参数可作为glm调用的变量及输出模型名
实现方案
你原有代码无法达到预期的核心原因有两个:
- glm公式中直接写入参数
myvar时,R会默认在数据集里搜索名为myvar的列,不会自动解析为你传入的变量名 - 函数内部直接对
mymodel赋值仅在函数局部环境生效,函数运行结束后全局环境无法访问生成的模型
方案1:完全匹配你的调用习惯(无需传字符串,base R原生实现)
直接用deparse(substitute())捕获传入的参数名,再手动构造公式,最后把生成的模型赋值到全局环境:
myfunc <- function(myvar, mymodel) { # 捕获传入的变量名、模型名,转为字符串 var_name <- deparse(substitute(myvar)) model_name <- deparse(substitute(mymodel)) # 构造回归公式 reg_formula <- as.formula(paste0("var1 ~ var2 + var3 + var4 + ", var_name)) # 拟合逻辑回归 fit_model <- glm(reg_formula, data = myframe, family = "binomial") # 将模型赋值到全局环境 assign(x = model_name, value = fit_model, envir = .GlobalEnv) }
调用方式和你预期完全一致:
# 运行后全局环境会直接生成model_A、model_B对象 myfunc(var_A, model_A) myfunc(var_B, model_B)
方案2:更符合R开发规范的写法(不修改全局环境,避免变量污染)
更推荐让函数直接返回拟合好的模型,你在外部手动赋值,不需要操作全局环境,稳定性更高:
myfunc <- function(myvar) { var_name <- deparse(substitute(myvar)) reg_formula <- as.formula(paste0("var1 ~ var2 + var3 + var4 + ", var_name)) return(glm(reg_formula, data = myframe, family = "binomial")) }
调用方式:
model_A <- myfunc(var_A) model_B <- myfunc(var_B)
内容的提问来源于stack exchange,提问作者MPhilibert
相关产品推荐
相关产品推荐

