8

quiero hacer algo como¿Cómo obtengo opciones interdependientes?

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

y tienen Mathematica dame 1, en lugar de 0. ¿Hay una mejor manera de hacer esto que

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

?

Por un lado, es ineficaz establecer las opciones de foo en cada llamada, especialmente si foo tiene muchas opciones.

+0

pregunta duplicado: [Definición de una función con un valor opcional que está por defecto en función de otra paramether de la función en Mathematica] (http://stackoverflow.com/q/7394113/211232) – WReach

Respuesta

8

Es por eso que tenemos Automatic. Utilizaría algo como:

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 *) 

Además, esto permite una interpretación más complicada de los valores automáticos si lo necesita.

4

Usted escribió:

yo a querer hacer algo así como

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

y tienen Mathematica dame 1, en lugar de 0.

me sale OptionValue[a] como un cambio de esta, no 1 O 0. Esto es porque OptionValue debe coincidir con OptionsPattern[] y no lo es. Consideremos:

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

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

Aquí es un método posible para llevar a cabo su objetivo. Menciono el OptionsPattern[] para poder trabajar con estas reglas fuera de OptionValue. Tenga en cuenta que aún puedo especificar un valor explícito para 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
Cuestiones relacionadas