在 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)
}
}
假设我想在函数中使用 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)
}
}