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