【发布时间】:2017-10-16 02:34:53
【问题描述】:
我正在用 R 开发一个框架,并希望我的一个功能是多用途的。我想通过要求传递一组参数来实现这一点。换句话说,我想编写一个函数foo,它需要参数x 和y 或参数a。如果两个集合都没有提供,如果一个集合不完整,或者两个集合都提供,则应该抛出错误。
实现此目的的一种方法是仅使用可选参数,后跟if 语句。这在下面演示。但是,我想更优雅地做到这一点。
foo <- function(x, y, a){
if (!missing(a) & missing(x) & missing(y)){
a
return("Only a provided")
} else if (missing(a) & !missing(x) & !missing(y)){
x; y
return("x and y provided")
} else {
stop("No complete and/or distinct argument set provided")
}
该功能应该如下工作:
> foo(a = 1)
[1] "Only a provided"
> foo(x = 1, y = 2)
[1] "x and y provided"
> foo()
Error in foo() : No complete and/or distinct argument set provided
> foo(x = 1)
Error in foo(x = 1) : No complete and/or distinct argument set provided
> foo(x = 1, y = 2, a = 3)
Error in foo(x = 1, y = 2, a = 3) :
No complete and/or distinct argument set provided
额外的功劳还包括一个可以处理任意数量、任意大小的参数集的通用答案。
除此之外:上面的示例使用missing() 并且没有参数默认值,但这绝不是要求。我可以灵活地使用各种格式,只要它们能很好地解决手头的问题。
【问题讨论】:
-
我认为您的三个选项是(a)如果
x和a显然是不同类型的对象,您可以使用S3 method dispatch; (b) 正如你所做的那样,使用missing或默认值,例如NULL; (c) S4、参考等级或 R6 之一。由于您没有说明x和a是什么,因此唯一可验证的选项是第二个选项,使用missing或检查默认值(例如,NULL),如您所示。
标签: r function arguments argument-matching