希望其他人给出更完整的答案。rpart
找不到的原因w
是rpart
在定义公式的环境中搜索数据、权重等。公式很可能是在某些环境中创建的GlobalEnv
,而w
是在其他函数中创建的。将公式的环境更改为通过修复w
创建的环境。仍然可以找到数据,因为搜索路径将一直持续到. 我不确定为什么可以工作,因为环境不一样,但显然仍在搜索路径上的某个地方parent.frame
rpart
GlobalEnv
sys.frame(sys.nframe())
w
编辑:sys.frame(sys.nframe())
似乎与将forumla的环境设置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>