r函数错误:找不到对象“ y”

时间:2018-08-11 10:30:58

标签: r function eval lm

我真的很难理解为什么此功能不起作用。 这只是一个返回简单线性模型系数的函数:

prime 10^9+7

现在我创建任何随机数据集:

lmfunction <- function(data,y,x,index){
  return(coef(lm(y~x,data=data,subset=index)))
}

当我尝试在数据集上运行该函数时,出现以下错误:

dataset <- data.frame(x=rnorm(100),y=rnorm(100)*2)

y变量确实存在,所以我不理解此错误。

编辑:

我重新启动了r会话,以上代码正常工作。但是,如果我在真实数据集上使用它,仍然会遇到问题:

lmfunction(dataset,y,x,1:100)

Error in eval(predvars, data, env) : object 'y' not found

2 个答案:

答案 0 :(得分:2)

与您可能构建的大多数其他函数不同,您没有传递对象:您试图构建公式,因此会出错。

lmFunc <- function(data, formula){
    formula <- as.formula(formula)
    lm <- lm(formula, data)
    coef(lm)
}

lmFunc(mtcars, qsec ~ mpg)

答案 1 :(得分:0)

如果您希望函数的结构保持为4个输入且不带引号,则可以执行以下操作:

library(dplyr)

lmfunction <- function(data, y, x, index){
  data %>% 
    select(my_y = !!enquo(y), my_x = !!enquo(x)) %>% 
    lm(my_y~my_x, data = ., subset = index) %>% 
    coefficients()
}

lmfunction(iris, Sepal.Length, Petal.Length, 1:150)
#> (Intercept)        my_x 
#>   4.3066034   0.4089223

lmfunction(mtcars, qsec ,mpg, 1:32)
#> (Intercept)        my_x 
#>  15.3547689   0.1241366

我们要做的是将所需的变量包装在enquo中,以避免出现“找不到对象'**'”错误。然后,我们同时选择变量并将其重命名。我重命名的原因是我发现很难在lm中加入定量。然后,我们使用新命名的变量运行lm