Значение по умолчанию при вызове функции в цикле for - PullRequest
0 голосов
/ 11 декабря 2018

Предположим, я хочу перебрать различные значения с помощью цикла for в функции (например, randomForest)

for (i in c(100, 200, 500)){
randomForest(Predictor ~., data = train, ntree = i)}

Одним из значений, переданных в функцию randomForest, которую я хочу оценить, является значение по умолчанию (предположим, я не знаю, что значение по умолчанию для ntree в randomForest равно 500)

Как мне указать это в цикле for?

for (i in c(100,200, default)){
randomForest(Predictor ~., data = train, ntree = i)}

Ответы [ 3 ]

0 голосов
/ 11 декабря 2018

Вы можете найти значение с помощью formals, который дает вам список, который включает все значения по умолчанию.Но он имеет свой собственный набор проблем, поскольку не все функции обрабатывают вещи одинаково.

Первая проблема становится понятной в вашем примере: formals(randomForest) дает вам только x и ...,оба без значений по умолчанию.Это потому, что randomForest - это универсальный метод, который принимает разные аргументы в зависимости от класса первого.Чтобы получить значение по умолчанию для ntree, вам нужно

formals(randomForest:::randomForest.default)$ntree

Некоторые другие проблемы, о которых я могу подумать:

  • Может быть даже неясно, что представляет собой отсутствующее значение или значение по умолчанию,Когда-нибудь видели разницу между somedataframe[1] и somedataframe[1,] или somedataframe[,1]?Что такое по умолчанию?
  • Как насчет необязательных аргументов, которым присваивается другое значение внутри функции?Возьмем, к примеру, сюжет: если вы ничего не указали, он генерирует собственный заголовок.Но что такое заголовок «по умолчанию»?
  • Для некоторых функций существует разница в , где приходит аргумент, где он оценивается.Это особенно важно при работе со средами, так что match.call() и match.call со всеми аргументами, указанными в значениях по умолчанию, будут давать разные результаты.

Итак, я думаю, что все вместелучше просто сделать вызов вне цикла или позвонить с if ... else

0 голосов
/ 11 декабря 2018

Просто добавьте это в микс, потому что мне нравится, что он прост и удобочитаем, просто как опция:

for (i in c(100,200,NA)){
  if (is.na(i)){ 
    randomForest(Predictor ~., data = train)
  } else{
    randomForest(Predictor ~., data = train,ntree = i)
  }
}
0 голосов
/ 11 декабря 2018

Вы не можете действительно передать «пропущенные» значения аргумента в R. Если вы хотите убедиться, что значение по умолчанию включено в список вещей, по которым вы перебираете, я бы порекомендовал

values <- unique(c(100, 200, formals(randomForest:::randomForest.default)$ntree))
for (i in valies){
  randomForest(Predictor ~., data = train, ntree = i)}

Здесь мы просто используем formals() в функции, чтобы получить значение по умолчанию, а я использовал unique(), чтобы убедиться, что значение еще не было включено.

...