我正在尝试构建一个围绕包中的ordiR2step()
函数的函数vegan
。这个函数是基于step()
函数的。
这是在函数之外完美运行的代码:
install.packages("vegan")
require(vegan)
data(mite)
data(mite.env) #explanatory variables
mite.hel = decostand(mite, "hel") #response variable
mod0 <- rda(mite.hel ~ 1, mite.env) # Model with intercept only
mod1 <- rda(mite.hel ~ ., mite.env) # Model with all explanatory variables
step.res <- ordiR2step(mod0, scope = formula(mod1), direction="forward")
step.res$anova
但是,如果我尝试将其包装成一个函数:
forward <- function(X, Y) {
intercept <- rda(X ~ 1, data = Y) # Model with intercept only
model <- rda(X ~ ., data = Y) # Model with all explanatory variables
# this is where debugging is stuck
forStep <- ordiR2step(object=intercept, scope = formula(model),
direction = "forward", trace = FALSE)
list(forStep$anova)
}
forward(mite.hel, mite)
我收到以下错误:Error in eval(expr, envir, enclos) : object 'X' not found
我知道在尝试包装这些类型的函数时会出现一些问题,这些问题已经在 stackoverflow 和其他地方讨论过很多次,例如这里、这里和这里。但是,这些解决方案似乎都没有正常工作。
根据我对这种行为的理解,step()
函数以及扩展的ordiR2step()
, 无法从函数内定义的环境中读取,而只能从工作空间环境中读取,因为如果我X
在调用函数之前定义,一切都会正常运行。然而这违背了目的,所以我尝试了一些建议的解决方案,例如:
forward2 <- function(X, Y) {
intercept <- do.call("rda",list(X ~ 1, data = Y))
model <- do.call("rda", list(X ~ ., data = Y))
forStep <- ordiR2step(object=intercept, scope = formula(model),
direction = "forward", trace = FALSE)
list(forStep$anova)
}
forward2(mite.hel, mite.env)
同样的错误...没有骰子...有什么建议吗?谢谢你的时间!