作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何将多个允许的参数值中的第一个以外的值声明为默认值(如果未传入任何值)?
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
如果可能的话,我希望查看函数签名中的默认值,以便使默认值显式(可见),例如。 G。 (无效的伪代码!)将第二个元素设置为默认值:
center <- function(x, type = c("mean", "median", "trimmed")[2]) {...
也欢迎其他建议!
PS:我可以将默认值始终放在第一个位置,但如果列表中存在逻辑顺序,我宁愿保留它(例如 payment.Frequency = c("monthly", "quarterly"、“半年一次”、“每年一次”)
。
最佳答案
您可以修改 match.arg
以采用第二个 arg
值而不是第一个值。只需在函数体中查找并替换该行即可。
matchArg <- base::match.arg
body(matchArg)[[c(4, 3, 2, 3)]] <- quote(return(arg[2L]))
现在,我们将 match.arg
替换为 center
内的新 matchArg
函数,现在我们将获得第二个 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
当然,这不能满足您的可见性要求。但这只是一个想法。
关于R 与 match.arg 类似的枚举参数 : How to choose a non-first element as default value?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45247177/
我是一名优秀的程序员,十分优秀!