当在函数内部使用时,rpart有找到变量的问题

时间:2016-03-04 13:53:22

标签: r

我有以下问题。我编写了一个函数,我使用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 )

2 个答案:

答案 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 )
}