首页 > 解决方案 > 在用户定义的函数中调用 glm() 函数

问题描述

我一直在尝试创建一个在其中使用 glm() 的函数。但我总是收到一条错误消息。看起来该函数没有检索变量的值。

set.seed(234)
sex <- sample(c("M", "F"), size=100, replace=TRUE)
age <- rnorm(n=100, mean=20 + 4*(sex=="F"), sd=0.1)
dsn <- data.frame(sex, age)
rm(sex, age) #remove sex and age from the global environment for reproducibility

to_analyze <- function(dep, indep, data){
  glm(dep~factor(indep), data=data)
}

to_analyze(dep=age, indep=sex, data=dsn)
#> Error in eval(predvars, data, env): object 'age' not found


标签: rfunctionglm

解决方案


您可以使用以下任何一种:

使用substitute

to_analyze <- function(dep, indep, data){
  glm(substitute(dep ~ factor(indep)), data=data)
}

to_analyze(dep=age, indep=sex, data=dsn)

优点:可以独立写成公式。

例如

 to_analyze(Petal.Width, Sepal.Length + Sepal.Width, data = iris)

使用@NelsonGon所述的重新制定

to_analyze <- function(dep, indep, data){ 
  glm(reformulate(sprintf("factor(%s)",indep), dep),  data = data) 
 }

请注意,要调用此函数,变量应该是字符类型

 to_analyze(dep= "age", indep="sex", data=dsn)

Recallglm还可以采用可以解析为公式的字符串:

to_analyze <- function(dep, indep, data){ 
  glm(sprintf("%s~factor(%s)", dep, indep),  data = data) 
}

to_analyze("age", "sex", data=dsn)

甚至:

to_analyze <- function(dep, indep, data){ 
  glm(paste(dep,"~ factor(",indep,")"),  data = data) 
}

to_analyze("age", "sex", data=dsn)

最后:结合替代品和粘贴:

to_analyze <- function(dep, indep, data){ 
  glm(paste(substitute(dep),"~ factor(",substitute(indep),")"),  data = data) 
}

适用于符号和字符。例如:

to_analyze(age, sex, data=dsn)
to_analyze("age", "sex", data=dsn)

推荐阅读