基于step()的用户定义函数给出:eval(expr,envir,enclos)中的错误:object' X'未找到

时间:2014-05-15 05:32:36

标签: r vegan

我正在尝试构建一个包含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和其他地方多次讨论过,例如herehere和{{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)

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

0 个答案:

没有答案