他の誰かがより完全な答えを出してくれることを願っています。rpart
見つからない理由w
は、数式が定義されている環境でデータ、重みなどを検索するためです。数式は、rpart
おそらく何らかの環境で作成され、他の関数内で作成されます。式の環境を作成した環境に変更するという修正を行いました。検索パスは常に に続くため、. 環境が同じではないため、なぜ機能するのかわかりませんが、明らかに検索パスのどこかにあるようですGlobalEnv
w
w
parent.frame
rpart
GlobalEnv
sys.frame(sys.nframe())
w
edit:で呼び出されるsys.frame(sys.nframe())
関数の環境にフォーラムの環境を設定するのと同じようですrpart
(foo3
この例では)。その場合、で、 などをrpart
探し、次に.w
data
foo3
bar3
GlobalEnv
library(rpart)
data(iris)
bar <- function(formula, data) {
w <- rpois(nrow(iris), 1)
print(environment())
foo(formula, data, w)
}
foo <- function(formula, data, w) {
print(environment(formula))
fit <- rpart(formula, data, weights = w)
return(fit)
}
bar(I(Species == "versicolor") ~ ., data = iris)
## <environment: 0x1045b1a78>
## <environment: R_GlobalEnv>
## Error in eval(expr, envir, enclos) (from #2) : object 'w' not found
bar2 <- function(formula, data) {
w <- rpois(nrow(iris), 1)
print(environment())
foo2(formula, data, w)
}
foo2 <- function(formula, data, w) {
print(environment(formula))
environment(formula) <- parent.frame()
print(environment(formula))
fit <- rpart(formula, data, weights = w)
return(fit)
}
bar2(I(Species == "versicolor") ~ ., data = iris)
## <environment: 0x100bf5910>
## <environment: R_GlobalEnv>
## <environment: 0x100bf5910>
bar3 <- function(formula, data) {
w <- rpois(nrow(iris), 1)
print(environment())
foo3(formula, data, w)
}
foo3 <- function(formula, data, w) {
print(environment(formula))
environment(formula) <- environment() ## seems to be the same as sys.frame(sys.nframe())
print(environment(formula))
print(environment())
fit <- rpart(formula, data, weights = w)
return(fit)
}
bar3(I(Species == "versicolor") ~ ., data = iris)
## <environment: 0x104e11bb8>
## <environment: R_GlobalEnv>
## <environment: 0x104b4ff78>
## <environment: 0x104b4ff78>