Search code examples
functionwolfram-mathematicanamed-parameters

Optional named arguments in Mathematica


What's the best/canonical way to define a function with optional named arguments? To make it concrete, let's create a function foo with named arguments a, b, and c, which default to 1, 2, and 3, respectively. For comparison, here's a version of foo with positional arguments:

foo[a_:1, b_:2, c_:3] := bar[a,b,c]

Here is sample input and output for the named-arguments version of foo:

foo[]                  --> bar[1,2,3]
foo[b->7]              --> bar[1,7,3]
foo[a->6, b->7, c->8]  --> bar[6,7,8]

It should of course also be easy to have positional arguments before the named arguments.


Solution

  • I found the standard way to do it in the Mathematica documentation: http://reference.wolfram.com/mathematica/tutorial/SettingUpFunctionsWithOptionalArguments.html

    Options[foo] = {a->1, b->2, c->3};  (* defaults *)
    foo[OptionsPattern[]] := bar[OptionValue@a, OptionValue@b, OptionValue@c]
    

    Typing "OptionValue" every time is a little cumbersome. For some reason you can't just make a global abbreviation like ov = OptionValue but you can do this:

    foo[OptionsPattern[]] := Module[{ov},
      ov[x___] := OptionValue[x];
      bar[ov@a, ov@b, ov@c]]
    

    Or this:

    With[{ov = OptionValue},
      foo[OptionsPattern[]] := bar[ov@a, ov@b, ov@c]
    ]
    

    Or this:

    $PreRead = ReplaceAll[#, "ov" -> "OptionValue"] &;
    
    foo[OptionsPattern[]] := bar[ov@a, ov@b, ov@c]