如何将多个允许的参数值中的第一个值声明为默认值(如果没有传入值)?
library(stats)
center <- function(x, type = c("mean", "median", "trimmed")) {
type <- match.arg(type)
switch(type,
mean = mean(x),
median = median(x),
trimmed = mean(x, trim = .1))
}
values <- c(100, 120, 200)
center(values, "median")
# [1] 120
center(values, "mean")
# [1] 140
# uses the first value "mean" as the default!
center(values)
# [1] 140如果可能的话,我希望在函数签名中看到默认值,以便使默认值显式(可见),例如(不工作的伪代码!)若要使第二个元素成为默认值,请执行以下操作:
center <- function(x, type = c("mean", "median", "trimmed")[2]) {...其他建议也是受欢迎的!
PS:我可以将默认值放在第一个位置,但是如果列表中有逻辑顺序,我更愿意保留它(例如,payment.frequency = c("monthly", "quarterly", "semi-annually", "annually") )。
发布于 2017-07-21 22:20:20
您可以修改match.arg以获取第二个arg值,而不是第一个。这只是一个在函数体中找到并替换这条线的问题。
matchArg <- base::match.arg
body(matchArg)[[c(4, 3, 2, 3)]] <- quote(return(arg[2L]))现在,我们在match.arg中用新的matchArg函数替换center,默认情况下,我们将得到第二个type值(中位数)。
center <- function(x, type = c("mean", "median", "trimmed")) {
type <- matchArg(type)
switch(type,
mean = mean(x),
median = median(x),
trimmed = mean(x, trim = .1))
}
values <- c(100, 120, 200)
center(values)
# [1] 120
center(values, "mean")
# [1] 140当然,这不符合您的可见性要求。但这是个主意。
发布于 2017-07-23 08:37:45
由于@RichScriven展示了如何修改match.arg的公认答案,我找到了一种方法来注释函数签名中的默认值(在我的问题中这是一个可选的愿望)。
诀窍是使用向量元素的名称“注释”默认值:
matchArg <- base::match.arg
body(matchArg)[[c(4, 3, 2, 3)]] <- quote(
return(
if ("default" %in% names(arg)) {
arg[["default"]] }
else {
arg[[1L]]
})
)
center <- function(x, type = c("mean", default = "median", "trimmed")) {
type <- matchArg(type)
switch(type,
mean = mean(x),
median = median(x),
trimmed = mean(x, trim = .1))
}现在,默认值是(带注释的)第二个值:
> values <- c(100, 120, 200)
> center(values, "median")
[1] 120
> center(values, "mean")
[1] 140
> center(values)
[1] 120PS:如果有足够多的用户认为这个特性是必需的,那么这个解决方案就值得对基本R进行修补。
https://stackoverflow.com/questions/45247177
复制相似问题