在for循环中调用函数时的默认值

时间:2018-12-10 21:50:00

标签: r for-loop default random-forest

假设我想在函数(例如randomForest)中使用for循环迭代不同的值

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

传递给randomForest函数的值之一是默认值(假设我不知道randomForest中ntree的默认值是500)

如何在for循环中指定它?

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

3 个答案:

答案 0 :(得分:3)

您可以使用formals查找值,这会为您提供一个包含所有默认值的列表。但这带来了一系列问题,因为并非所有函数都以完全相同的方式处理事物。

第一个问题在您的示例中显而易见:formals(randomForest)仅给您x...,两者都没有默认值。这是因为randomForest是通用方法,它根据第一个方法的类接受不同的参数。要获得ntree的默认设置,您需要

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

我能想到的更多问题:

  • 可能甚至不清楚丢失或默认值是什么。是否见过somedataframe[1]somedataframe[1,]somedataframe[,1]之间的区别?默认值是什么?
  • 在函数内赋予其他值的可选参数呢?以一个情节为例:如果不指定任何内容,它将生成自己的标题。但是“默认”标题是什么?
  • 对于某些函数,参数来自何处,在何处计算是不同的。这一点在处理环境时尤其重要,因此match.call()match.call的所有参数均按照默认值指定填充,将给出不同的结果。

总而言之,我认为您最好将呼叫放在循环外,或者使用if ... else

答案 1 :(得分:2)

您不能真正在R中传递“缺失”参数值。如果您要确保默认值包含在要迭代的事物列表中,我建议

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

在这里,我们只在函数上使用formals()来获取默认值,而我使用unique()来确保尚未包含该值。

答案 2 :(得分:2)

只需将其添加到混合中,因为我喜欢它简单易读,只是作为一种选择:

for (i in c(100,200,NA)){
  if (is.na(i)){ 
    randomForest(Predictor ~., data = train)
  } else{
    randomForest(Predictor ~., data = train,ntree = i)
  }
}