8

tôi muốn làm một cái gì đó giống nhưLàm cách nào để nhận các tùy chọn phụ thuộc lẫn nhau?

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

và có Mathematica cho tôi 1, thay vì 0. Có cách nào tốt hơn để thực hiện việc này hơn

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

?

Đối với một điều, việc đặt tùy chọn foo là không hiệu quả, đặc biệt nếu foo có nhiều tùy chọn.

+0

trùng lặp câu hỏi: [Định nghĩa một hàm với một giá trị tùy chọn đó là theo mặc định một chức năng của một paramether của hàm trong Mathematica] (http://stackoverflow.com/q/7394113/211232) – WReach

Trả lời

8

Đây là lý do tại sao chúng tôi có Automatic. Tôi muốn sử dụng một cái gì đó như:

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

Thêm vào đó cho phép diễn giải phức tạp hơn các giá trị tự động nếu bạn cần.

4

Bạn đã viết:

tôi muốn làm một cái gì đó giống như

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

và có Mathematica cho tôi 1, thay vì 0.

Tôi nhận được OptionValue[a] làm lợi tức cho việc này, chứ không phải 1 HOẶC 0. Điều này là do OptionValue phải khớp với OptionsPattern[] và không. Xem xét:

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

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

Đây là một phương pháp có thể để thực hiện mục tiêu của bạn. Tôi đặt tên cho số OptionsPattern[] để tôi có thể làm việc với các quy tắc này ngoài OptionValue. Lưu ý rằng tôi vẫn có thể chỉ định một giá trị rõ ràng cho 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