使用省略号将参数传递给函数,并为某些不存在的参数设置默认值
Pass arguments to function using ellipsis and set default for some if not existing
我有一个主函数,它将参数传递给另一个使用 rpart
生成模型的函数。我希望可以使用省略号从主函数指定 rpart.control
。如果没有定义 cp
或 minbucket
,那么我想对这两个参数使用我的默认值。
到目前为止,我没有成功 - 请参阅下面的草稿。当前该函数抱怨没有找到 cp
。我明白为什么,但无法弄清楚,如果用户没有提供自己的控件,如何应用默认值。
require(rpart)
a <- function(df, ...) {
b(df, ...)
}
b <- function(df, ...) {
if (is.null(cp)) cp <- 0.001
if (is.null(minbucket)) minbucket = nrow(df) / 20
rcontrol <- rpart.control(cp = cp, minbucket = minbucket, ...)
rcontrol
}
a(iris) # no controls set my defaults for cp and minbucket
a(iris, cp = 0.123) # set cp, use my default for minbucket
a(iris, cp = 0.123, minbucket = 100) # set cp, and minbucket
a(iris, maxcompete = 3) # use my defaults for cp and minbucket, but pass maxcompete
这里是对您的函数的一个小修正:首先应用 list(...)
。
b <- function(df, ...) {
l <- list(...)
if (is.null(l$cp)) l$cp <- 1
if (is.null(l$minbucket)) l$minbucket <- 2
print_all(l$cp, l$minbucket, ...)
}
print_all <- function(...) {
print(list(...))
}
运行 您的示例以确保设置了所有默认值。
这可能适合你
a <- function(df, cp = NULL, minbucket = NULL, ...) {
if (is.null(cp)) cp <- 0.001
if (is.null(minbucket)) minbucket <- nrow(df) / 20
rpart.control(cp = cp, minbucket = minbucket, ...)
}
更多信息的好来源(Hadley Wickham 的 Advanced R)
http://adv-r.had.co.nz/Functions.html
也有类似的疑问,不知道这个是不是更简单的方法,按照tonytonov修改后的例子:
b2 <- function(df, cp=1, minbucket=2, ...) {
print_all(cp=cp, minbucket=minbucket, ...)
}
print_all <- function(cp=cp, minbucket=minbucket, ...) {
print(paste(cp, minbucket))
print(list(...))
}
基本上,默认值也可以被 ...
参数覆盖。
我是不是遗漏了什么,或者现在只有在 R 在过去 6 年中得到进一步发展才有可能做到这一点?
我有一个主函数,它将参数传递给另一个使用 rpart
生成模型的函数。我希望可以使用省略号从主函数指定 rpart.control
。如果没有定义 cp
或 minbucket
,那么我想对这两个参数使用我的默认值。
到目前为止,我没有成功 - 请参阅下面的草稿。当前该函数抱怨没有找到 cp
。我明白为什么,但无法弄清楚,如果用户没有提供自己的控件,如何应用默认值。
require(rpart)
a <- function(df, ...) {
b(df, ...)
}
b <- function(df, ...) {
if (is.null(cp)) cp <- 0.001
if (is.null(minbucket)) minbucket = nrow(df) / 20
rcontrol <- rpart.control(cp = cp, minbucket = minbucket, ...)
rcontrol
}
a(iris) # no controls set my defaults for cp and minbucket
a(iris, cp = 0.123) # set cp, use my default for minbucket
a(iris, cp = 0.123, minbucket = 100) # set cp, and minbucket
a(iris, maxcompete = 3) # use my defaults for cp and minbucket, but pass maxcompete
这里是对您的函数的一个小修正:首先应用 list(...)
。
b <- function(df, ...) {
l <- list(...)
if (is.null(l$cp)) l$cp <- 1
if (is.null(l$minbucket)) l$minbucket <- 2
print_all(l$cp, l$minbucket, ...)
}
print_all <- function(...) {
print(list(...))
}
运行 您的示例以确保设置了所有默认值。
这可能适合你
a <- function(df, cp = NULL, minbucket = NULL, ...) {
if (is.null(cp)) cp <- 0.001
if (is.null(minbucket)) minbucket <- nrow(df) / 20
rpart.control(cp = cp, minbucket = minbucket, ...)
}
更多信息的好来源(Hadley Wickham 的 Advanced R) http://adv-r.had.co.nz/Functions.html
也有类似的疑问,不知道这个是不是更简单的方法,按照tonytonov修改后的例子:
b2 <- function(df, cp=1, minbucket=2, ...) {
print_all(cp=cp, minbucket=minbucket, ...)
}
print_all <- function(cp=cp, minbucket=minbucket, ...) {
print(paste(cp, minbucket))
print(list(...))
}
基本上,默认值也可以被 ...
参数覆盖。
我是不是遗漏了什么,或者现在只有在 R 在过去 6 年中得到进一步发展才有可能做到这一点?