8

私は相互依存オプションを取得するにはどうすればよいですか?

foo[OptionsPattern[]] := OptionValue[b] 
Options[foo] = {a -> 0, b :> OptionValue[a]}; 
foo[a -> 1] 

ような何かをするとMathematicaはなく0の、私に1を与えてきたいと思います。これを行うより良い方法はありますか?

foo[OptionsPattern[]] := (
    Options[foo] = {a -> 0, b :> OptionValue[a]}; 
    OptionValue[b] 
) 
foo[a -> 1] 

特に、fooに多くのオプションがある場合は、すべての呼び出しでfooというオプションを設定するのは非効率です。

+0

重複質問:([デフォルトでMathematicaの機能の別のparametherの関数である任意の値を持つ関数の定義] http://stackoverflow.com/q/7394113/211232) – WReach

答えて

8

これは私たちがAutomaticを持っている理由です。私は次のようなものを使用します:

Options[foo] = {a -> 0, b -> Automatic}; 

foo[OptionsPattern[]] := 
      Block[{a, b}, 
       {a, b} = OptionValue[{a, b}]; 
       If[b === Automatic, a, b] 
       ] 

foo[] 
(* --> 0 *) 

foo[a -> 1] 
(* --> 1 *) 

foo[a -> 1, b -> 2] 
(* --> 2 *) 

プラスこれにより、必要に応じて自動値の解釈がより複雑になります。

4

あなたは書きました:

は私が

foo[OptionsPattern[]] := OptionValue[b] 
Options[foo] = {a -> 0, b :> OptionValue[a]}; 
foo[a -> 1] 

ような何かをしたいとMathematicaは私に1を与える必要があり、代わりに0の。

私は、このために、戻り、ない1 OR 0としてOptionValue[a]を取得します。これは、OptionValueOptionsPattern[]と一致するためであり、そうではありません。考えてみましょう。

ClearAll[foo, a, b] 
Options[foo] = {a -> 0}; 
foo[___] := OptionValue[a] 

foo[it, doesnt, matter] 
(* Out[]= OptionValue[a] *)

は、あなたの目標を達成する一つの可能​​な方法です。私はOptionsPattern[]という名前をつけて、OptionValueの外でこれらのルールを扱うことができます。 bの明示的な値を指定することができます。

ClearAll[foo, a, b] 
Options[foo] = {a -> 0, b -> a}; 
foo[opts : OptionsPattern[]] := OptionValue[b] /. {opts} 

foo[a -> 1] 
foo[a -> 3, b -> 7] 
1
7
関連する問題