我有以下问题。我编写了一个函数,我使用rpart包在一个点上计算分类树。
在函数内部,我初始化树的权重。但是,我得到一个错误,即rpart函数找不到权重变量(这是确切的错误消息:Error in eval(expr, envir, enclos) : object 'w' not found
)。
当我在函数外部运行代码时,它可以正常工作。最后,您可以找到我的问题的小玩具示例。我真的不明白最新情况。可以吗,rpart在全局环境中查找变量吗?
我的问题的玩具示例:
# Load Package
library(rpart)
# Create simple wrapper function for rpart
example <- function( form, data ){
N <- nrow( data )
w <- rep( 1/N , N )
tree <- rpart( form , data = data, weights = w )
return( tree )
}
# Get adjust and data set / define model
df <- mtcars
df$mpg <- as.factor( ifelse( df$mpg < 15 , 1 , 0 ) )
model <- formula( mpg ~ . )
# Run function - THIS PRODUCES AND ERROR
test <- example( model, df )
# Re-run the same outisde the function - THIS WORKS
N <- nrow( df )
w <- rep( 1/N , N )
rpart( model , data = df, weights = w )
答案 0 :(得分:3)
实际上rpart()
在公式指定的环境中查找变量。 R中的公式实际上包含对创建它们(定义)的环境的引用。由于您在全局环境中创建了公式,因此在那里搜索变量(如果在data.frame中找不到)。如果您愿意,可以更改环境
example <- function( form, data ){
environment(form)<-environment()
N <- nrow( data )
w <- rep( 1/N , N )
tree <- rpart( form , data = data, weights = w )
return( tree )
}
但是混合来自环境和data.frames的变量可能会变得棘手,所以要小心。
答案 1 :(得分:2)
将权重列添加到数据框:
example <- function( form, data ){
N <- nrow( data )
data$w <- rep( 1/N , N ) # new column in data
tree <- rpart( form , data = data, weights = w )
return( tree )
}