希望其他人给出更完整的答案。 rpart 找不到 w 的原因是 rpart 在定义公式的环境中搜索数据、权重等。公式是在某些环境中创建的,很可能是 GlobalEnv 和 @ 987654325@ 是在其他函数中创建的。将公式的环境更改为使用parent.frame 创建w 的环境可以解决此问题。 rpart 仍然可以找到数据,因为搜索路径将始终继续到 GlobalEnv。我不确定为什么 sys.frame(sys.nframe()) 可以工作,因为环境不一样,但显然 w 仍然在搜索路径上
编辑:sys.frame(sys.nframe()) 似乎与将论坛的环境设置为调用函数rpart 的环境相同(在此示例中为foo3)。在这种情况下,rpart 在foo3 中查找w、data 等,然后是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>