3

我正在尝试构建一个围绕包中的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)

同样的错误...没有骰子...有什么建议吗?谢谢你的时间!

4

0 回答 0