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

Default value when calling a function in a for loop

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

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

你不能在 R 中真正传递 "missing" 参数值。如果你想确保默认值包含在你正在迭代的事物列表中,我建议

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

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

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

第一个问题在你的例子中变得很清楚:formals(randomForest) 只给你 x...,两者都没有默认值。这是因为 randomForest 是一种通用方法,它根据第一个参数的 class 接受不同的参数。要获得 ntree 的默认值,您需要

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

还有一些我能想到的问题:

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

综上所述,我认为你最好在循环外调用,或者用 if ... else

调用

只是将它添加到组合中,因为我有点喜欢它简单易读,只是作为一个选项:

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