f [arg1、arg2、…、argN]とf [{arg1、arg2、…、argN}]

任意の数の引数を受け入れ、単一の引数を処理するのと同じ方法で処理する関数(Rで記述)のAPIを再現しようとしています。はさまざまなデータセットのリストです。

次のように関数を定義できるようにするMathematicaイディオムはありますか?

f[ arg1, arg2, ..., argN ] 

動作

f[ {arg1, arg2, ..., argN} ] 

コメント

  • と同じf[args___]:= f[{args}]次に、f[{arg1_, arg2_,...}]の定義を指定します。

回答

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。

  • @ Mr.Wizard。 Switchを使用すると、すべての選択肢が1つの機能で処理できるように整理されるため、プログラミングの美学の感覚に訴えます。私は'通常、実行速度についてそれほど心配しているわけではありません。実行速度が遅いことが実際に明らかになるまではそうです。
  • コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です