任意の数の引数を受け入れ、単一の引数を処理するのと同じ方法で処理する関数(Rで記述)のAPIを再現しようとしています。はさまざまなデータセットのリストです。
次のように関数を定義できるようにするMathematicaイディオムはありますか?
f[ arg1, arg2, ..., argN ]
動作
f[ {arg1, arg2, ..., argN} ]
?
コメント
回答
Andy Rossがコメントで説明しているように、引数を正規の形式に前処理する定義を作成できます。柔軟性を説明するために彼の例を振り返る:
f[{args__}] := f[args] f[args__] := Multinomial[args] / Plus[args] f[{12, 7, 3}] == f[12, 7, 3]
True
この方法は、より複雑な前処理に役立ちますが、このような単純なケースでは、多くの場合、Alternatives
を使用する方が簡単です:
g[{args__} | args__] := Multinomial[args]/Plus[args] g[{12, 7, 3}] == g[12, 7, 3]
正しい
次の点に注意してくださいAlternatives
を使用すると、パターンが順番に試行されるため、手動で注文する必要があります。 args__
は単一の引数として{12, 7, 3}
と一致するため、パターンargs__ | {args__}
は期待どおりに機能しません。 。
回答
これを処理する方法はたくさんあります。私が採用する可能性が最も高いアプローチは、次の例で説明できます。
f[seqn : ___] := Module[{args = {seqn}}, Switch[args, {{___}}, "List of args", {_}, "One arg", {_, __}, "Two or more args", {}, "No args" ]] f[{x, y, z}] (* ==> "List of args" *) f[{x}] (* ==> "List of args" *) f[] (* ==> "No args" *) f[x] (* ==> "One arg" *) f[x, y, z] (* ==> "Two or more args" *)
もちろん、この手法を適用するたびに、ここに表示される文字列がいくつかに置き換えられます。独自のニーズに適したアクション。
別のアプローチは、処理する引数パターンごとに個別の関数を作成することです。
g[args : {___}] := "List of args" g[] := "No args" g[arg_] := "One arg" g[arg_, rest__] := "Two or more args" g[{x, y, z}] (* ==> "List of args" *) g[{x}] (* ==> "List of args" *) g[] (* ==> "No args" *) g[x] (* ==> "One arg" *) g[x, y, z] (* ==> "Two or more args" *)
コメント
- "が"を使用する理由は何ですか。 = “fa207eb35f”>
複数の定義について? Switch
は通常遅いので、理由なく使用しないでください、IMHO。
Switch
を使用すると、すべての選択肢が1つの機能で処理できるように整理されるため、プログラミングの美学の感覚に訴えます。私は'通常、実行速度についてそれほど心配しているわけではありません。実行速度が遅いことが実際に明らかになるまではそうです。
f[args___]:= f[{args}]
次に、f[{arg1_, arg2_,...}]
の定義を指定します。