Using do.call
as in 使用粘贴公式创建的 lme 拟合的方差分析测试失败提供了答案。
boot.stepAIC
无权访问form
当在函数内运行时;可以在这样的全球环境中重新创建;我们看到lm
正在使用form.1
作为公式,并删除它使得boot.stepAIC
fail.
> form.1<-as.formula(res~x+y+z)
> mm <- lm(form.1, dat.test)
> mm$call
lm(formula = form.1, data = dat.test)
> rm(form.1)
> boot.stepAIC(mm,dat.test)
# same error as OP
Using do.call
确实有效。这里我使用as.name
以及;否则mm
对象携带整个数据集而不仅仅是它的名称。
> form.1<-as.formula(res~x+y+z)
> mm <- do.call("lm", list(form.1, data=as.name("dat.test")))
> mm$call
lm(formula = res ~ x + y + z, data = dat.test)
> rm(form.1)
> boot.stepAIC(mm,dat.test)
要将其应用于原始问题,我会这样做:
fun.boot.lm.stepAIC<-function(dat,form) {
if(!inherits(form, "formula")) stop("No formula given")
mm <- do.call("lm", list(form, data=as.name(dat)))
do.call("boot.stepAIC", list(mm,data=as.name(dat)))
}
form.1<-as.formula(res~x+y+z)
fun.boot.lm.stepAIC(dat="dat.test",form=form1)
这也有效,但整个数据集也包含在最终输出对象中,以及控制台的最终输出中。
fun.boot.lm.stepAIC<-function(dat,form) {
if(!inherits(form, "formula")) stop("No formula given")
mm <- do.call("lm", list(form, data=dat))
boot.stepAIC(mm,data=dat)
}
form.1<-as.formula(res~x+y+z)
fun.boot.lm.stepAIC(dat=dat.test,form=form.1)