首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >与match.arg类似的r枚举参数:如何选择非第一元素作为默认值?

与match.arg类似的r枚举参数:如何选择非第一元素作为默认值?
EN

Stack Overflow用户
提问于 2017-07-21 21:49:43
回答 2查看 314关注 0票数 3

如何将多个允许的参数值中的第一个值声明为默认值(如果没有传入值)?

代码语言:javascript
运行
复制
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

如果可能的话,我希望在函数签名中看到默认值,以便使默认值显式(可见),例如(不工作的伪代码!)若要使第二个元素成为默认值,请执行以下操作:

代码语言:javascript
运行
复制
center <- function(x, type = c("mean", "median", "trimmed")[2]) {...

其他建议也是受欢迎的!

PS:我可以将默认值放在第一个位置,但是如果列表中有逻辑顺序,我更愿意保留它(例如,payment.frequency = c("monthly", "quarterly", "semi-annually", "annually") )。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-21 22:20:20

您可以修改match.arg以获取第二个arg值,而不是第一个。这只是一个在函数体中找到并替换这条线的问题。

代码语言:javascript
运行
复制
matchArg <- base::match.arg
body(matchArg)[[c(4, 3, 2, 3)]] <- quote(return(arg[2L]))

现在,我们在match.arg中用新的matchArg函数替换center,默认情况下,我们将得到第二个type值(中位数)。

代码语言:javascript
运行
复制
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

当然,这不符合您的可见性要求。但这是个主意。

票数 3
EN

Stack Overflow用户

发布于 2017-07-23 08:37:45

由于@RichScriven展示了如何修改match.arg的公认答案,我找到了一种方法来注释函数签名中的默认值(在我的问题中这是一个可选的愿望)。

诀窍是使用向量元素的名称“注释”默认值:

代码语言:javascript
运行
复制
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))
}

现在,默认值是(带注释的)第二个值:

代码语言:javascript
运行
复制
> values <- c(100, 120, 200)
> center(values, "median")
[1] 120
> center(values, "mean")
[1] 140
> center(values)
[1] 120

PS:如果有足够多的用户认为这个特性是必需的,那么这个解决方案就值得对基本R进行修补。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45247177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档