我正在尝试构建一个包含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和其他地方多次讨论过,例如here,here和{{3 }}。但是,这些解决方案似乎都没有正常运作。
根据我对这种行为的理解,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)
同样的错误......没有骰子......有什么建议吗?谢谢你的时间!