パッケージ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)
同じエラー...サイコロはありません...何か提案はありますか? 御時間ありがとうございます!