R でフレームワークを開発中ですが、機能の 1 つを多目的にしたいと考えています。厳密に 1 つの引数セットを渡すように要求することで、これを実現したいと考えています。つまり、引数とORfoo
引数のいずれかを必要とする関数を書きたいと思います。どちらのセットも指定されていない場合、セットが不完全な場合、または両方のセットが指定されている場合は、エラーがスローされます。x
y
a
これを実現する 1 つの方法は、オプションの引数のみを使用し、その後に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()
引数のデフォルトを使用せず、引数を使用していませんが、これは決して要件ではありません。目前の質問に対する適切な解決策を提供する限り、さまざまな形式を柔軟に使用できます。