为 R 中的函数参数设置可能的值(例如:f <- function(x){} 其中 x 必须是 `a` 或 `b`)
Set possible values for a function argument in R (ex: f <- function(x){} where x must be `a` or `b`)
在 R 中,如何定义像 f <- function(x){...}
这样的函数,它只能将参数 x
设为 'a'
或 'b'
?
[顺便说一句,当前(截至 2020 年)best/easy/practical 用于在 R 中创建函数的包是什么?还是氧气吗?]
R 中允许函数参数有这么多值之一的规范(惯用)方法是使用 match.arg
:
f <- function(x = c("a", "b")) {
x <- match.arg(x)
}
因为它默认为 several.ok=FALSE
,所以它将 x
减少为一个参数。如果未提供任何内容,则它将默认为向量中的第一个值。
但是,请注意,由于它在内部使用 pmatch
,因此它允许部分匹配。这意味着:
match.arg('a',c('aa','bb'))
# [1] "aa"
这可能不是您想要的。在那种情况下,RonakShah 的第一个建议(也修改为检查长度)可能是最直接的,以下 if
陈述之一:
f <- function(x) {
if (is.null(x) || length(x) != 1L || !x %in% c("a", "b")) {
stop("'x' argument must be one of: 'a','b'")
}
### or, if 'x' can have length>1, then
if (is.null(x) || !length(x) || !all(x %in% c("a", "b"))) {
stop("'x' argument must be one of: 'a','b'")
}
# ...
}
如果 x
的长度可以合法地大于 1,则将条件更新为 !all(x %in% c("a","b"))
。
仅供参考:roxygen
不用于创建函数。我相信它最初的强大之处在于它将文档保存在与代码相同的位置,这 可能 促使开发人员在函数本身被修改时更新文档。我相信在实践中这可能过于乐观,尤其是对于 roxygen 文档不在页面上的大型函数。
然而,另一个好处(在后续版本中)是它支持 markdown-formatted 文档,不再需要用户使用 R-centric 格式(例如,对于 URL,链接到其他 R functions/packages、代码、强调等)。
在 R 中,如何定义像 f <- function(x){...}
这样的函数,它只能将参数 x
设为 'a'
或 'b'
?
[顺便说一句,当前(截至 2020 年)best/easy/practical 用于在 R 中创建函数的包是什么?还是氧气吗?]
R 中允许函数参数有这么多值之一的规范(惯用)方法是使用 match.arg
:
f <- function(x = c("a", "b")) {
x <- match.arg(x)
}
因为它默认为 several.ok=FALSE
,所以它将 x
减少为一个参数。如果未提供任何内容,则它将默认为向量中的第一个值。
但是,请注意,由于它在内部使用 pmatch
,因此它允许部分匹配。这意味着:
match.arg('a',c('aa','bb'))
# [1] "aa"
这可能不是您想要的。在那种情况下,RonakShah 的第一个建议(也修改为检查长度)可能是最直接的,以下 if
陈述之一:
f <- function(x) {
if (is.null(x) || length(x) != 1L || !x %in% c("a", "b")) {
stop("'x' argument must be one of: 'a','b'")
}
### or, if 'x' can have length>1, then
if (is.null(x) || !length(x) || !all(x %in% c("a", "b"))) {
stop("'x' argument must be one of: 'a','b'")
}
# ...
}
如果 x
的长度可以合法地大于 1,则将条件更新为 !all(x %in% c("a","b"))
。
仅供参考:roxygen
不用于创建函数。我相信它最初的强大之处在于它将文档保存在与代码相同的位置,这 可能 促使开发人员在函数本身被修改时更新文档。我相信在实践中这可能过于乐观,尤其是对于 roxygen 文档不在页面上的大型函数。
然而,另一个好处(在后续版本中)是它支持 markdown-formatted 文档,不再需要用户使用 R-centric 格式(例如,对于 URL,链接到其他 R functions/packages、代码、强调等)。