Я хочу создать функцию, которая использует внутри нее функцию randomForest из пакета randomForest .Это принимает аргумент "subset", который представляет собой вектор номеров строк фрейма данных, который будет использоваться для обучения.Однако, если я использую этот аргумент при вызове функции randomForest в другой определенной функции, я получаю ошибку:
Error in eval(substitute(subset), data, env) :
object 'tr_subset' not found
Вот воспроизводимый пример, в котором мы пытаемся обучить случайный лес для классификации ответа "введите "или" A "или" B "на основе трех числовых предикторов:
library(randomForest)
# define a random data frame to train with
test.data = data.frame(
type = rep(NA, times = 500),
x = runif(500),
y = runif(500),
z = runif(500)
)
train.data$type[runif(500) >= 0.5] = "A"
train.data$type[is.na(test.data$type)] = "B"
train.data$type = as.factor(test.data$type)
# define the training range
training.range = sample(500)[1:300]
# formula to use
tr_form = formula(type ~ x + y + z)
# Function that includes the randomForest function
train_rf = function(form, all_data, tr_subset) {
p = randomForest(
formula = form,
data = all_data,
subset = tr_subset,
na.action = na.omit
)
return(p)
}
# test the new defined function
test_tree = train_rf(form = tr_form, all_data = train.data, tr_subset = training.range)
Запуск этого дает ошибку:
Error in eval(substitute(subset), data, env) :
object 'tr_subset' not found
Если, однако, subset = tr_subset
удаленоиз функции randomForest
, а tr_subset
удаляется из функции train_rf
, этот код работает нормально, однако весь набор данных используется для обучения!
Следует отметить, что при использовании subset
аргумент в randomForest
, когда не , определенный в другой функции, работает совершенно нормально и является предполагаемым методом для функции, как описано в виньетке, связанной выше.
Я знаю в среднемВ то время я мог бы просто определить другой обучающий набор, который имеет только требуемые номера строк, и тренироваться, используя все это, но есть ли причина, по которой мой оригинальный код не работает, пожалуйста?
Спасибо.
РЕДАКТИРОВАТЬ: я предполагаю, что, поскольку subset()
является базовой функцией R, R запутывается и думает, что вы хотите использовать базовую функцию R, а не определять аргумент функции randomForest
.Но я не эксперт, поэтому могу ошибаться.