2011-12-16 26 views
5

Điều này sẽ nhanh chóng đến một chuyên gia, nhưng tôi khá mới trong việc xác định các chức năng với các tùy chọn. Dưới đây là một sơ đồ về những gì tôi đã cố gắng, tôi sẽ giải thích sau khi hiển thị mã:Sự cố khi chuyển các tùy chọn trong các chức năng lô chuyên dụng cho Mathematica

MyPlotFunction[params_, optionalparameter_List:{1,2,3}, opts:OptionsPattern[]]:= 
    Plot [ stuff, {x,0,1}, [email protected][{opts},[email protected]]]; 

Options[MyPlotFunction] = { PlotRange->{-5,5}, Frame->True, ... other plot options}; 

Có bốn sự tinh tế nhẹ:

  1. Tôi có một tham số tùy chọn trong chức năng của tôi mà cần phải là một danh sách các số nguyên.
  2. Tôi muốn khả năng gọi hàm bằng bất kỳ tùy chọn Lô đất nào, đặc biệt là sử dụng các giá trị khác với các giá trị mặc định được chỉ định trong dòng thứ ba.
  3. Tôi muốn có các giá trị mặc định cho một số tùy chọn.
  4. Tôi có khả năng muốn đặt các tùy chọn khác trong hàm, do đó, không đảm bảo rằng tất cả các tùy chọn sẽ được chuyển đến lô.

Nhưng những gì tôi có ở trên không có tác dụng. Các tùy chọn mặc định tôi đặt sẽ bị bỏ qua, nhưng chúng xuất hiện trong thông tin ??MyPlotFunction cho chức năng của tôi. Tôi sẽ đưa ra các ví dụ nếu các bạn không thể phát hiện lỗi.

Edit: ví dụ đó không làm việc:

  1. SimplePlot[t_,opts:OptionsPattern[{PlotRange->{-4,4},Frame->True}]]:= Plot[2x+t,{x,0,1},opts]; Thất bại, tùy chọn mặc định sẽ được bỏ qua.

  2. SimplePlot[t_,opts:OptionPattern[]]:= Plot[2x+t],{x,0,1},opts]; Options[SimplePlot] = {PlotRange->{-4,4},Frame->True}; Không, tùy chọn mặc định bị bỏ qua.

  3. SimplePlot[t_,opts__:{PlotRange->{-4,4},Frame->True}]:= Plot[2x+t,{x,0,1},opts]; Tùy chọn mặc định hoạt động với cuộc gọi trống, nhưng nếu một trong các tùy chọn này hoặc bất kỳ tùy chọn lô đất nào khác bị ghi đè, các giá trị mặc định còn lại sẽ bị mất.

+0

Bạn có thể chỉnh sửa này với chi tiết hơn. Là params những thứ bạn đang âm mưu? Nếu vậy thì đặt nó làm đối số cho cốt truyện. Nếu không thì nó sẽ đi đâu? Nó cũng có thể giúp đỡ nếu bạn giải thích những gì các tham số tùy chọn là nghĩa vụ phải làm. Hàm của bạn không đóng "]" nhưng tôi cho rằng đây là lỗi cắt và dán. Bạn sẽ tìm thấy các cuộc thảo luận khác ở đây và Mathgroup về OptionValue, FilterRules và như vậy sẽ giúp bạn sử dụng các tùy chọn. –

Trả lời

9

OptionsPattern[] chỉ bắt các tùy chọn mà được thông qua vào, vì vậy bạn cần phải bao gồm một cách rõ ràng bất kỳ cài đặt tùy chọn không phải mặc định, nói bằng cách sử dụng một cái gì đó như:

FilterRules[{opts, Options[MyPlotFunction]}, [email protected]] 

Dưới đây là một ví dụ đơn giản:

Options[MyPlotFunction] = {PlotRange -> {-5, 5}, Frame -> True}; 

MyPlotFunction[params_, optionalparameter_List: {1, 2, 3}, 
    opts : OptionsPattern[MyPlotFunction]] := 
Plot[optionalparameter, {x, 0, 1}, 
    [email protected][{opts, Options[MyPlotFunction]}, [email protected]]] 

enter image description here

+0

Điều này có vẻ hữu ích, hãy kiểm tra ngay bây giờ. – braydenware

+0

Tính năng này hoạt động và hoạt động cho ứng dụng của tôi. Một phần tôi không hiểu là nó không còn hoạt động nếu tôi không lọc các tùy chọn.Lấy chính xác mã đó và thay thế Đánh giá @ FilterFules [{opts, Tùy chọn [MyPlotFunction]}, Options @ Plot] chỉ với opts. Có vẻ như bạn tham gia các tùy chọn mặc định cho các tùy chọn được chỉ định và cho ăn vào ô. Làm thế nào để Plot quyết định nên sử dụng cái gì khi bạn nạp nó vào các giá trị xung đột cho cùng một tùy chọn? – braydenware

+4

@braydenware Điểm không phải là bạn * lọc * các tùy chọn, nhưng bạn * chuyển * tùy chọn mặc định của bạn sau '{opts}', vì vậy ngay cả trong trường hợp không rõ ràng '{opts}', bạn vẫn chuyển tất cả các mặc định của bạn tùy chọn cài đặt một cách rõ ràng để 'Lô '. Đây cũng là lý do tại sao Brett đặt chúng sau '{opts}' - để các tùy chọn được thông qua một cách rõ ràng trong '{opts}' sẽ ghi đè lên các tùy chọn đó từ 'Tùy chọn [MyPlotFunction]' theo sau chúng. –

0

Như đã đề cập trong các ý kiến câu trả lời của Brett, vì tùy chọn cho tùy chọn THAY THẾ đầu tiên nêu phía sau, và vì tùy chọn để Vẽ thể được đưa ra như một danh sách, bạn có thể viết một cái gì đó như thế này:

Options[SimplePlot] = {PlotRange -> {-4, 4}, Frame -> True}; 

SimplePlot[t_, opts : OptionsPattern[]] := 
    Plot[2 x + t, {x, 0, 1}, opts, #] & @ Options[SimplePlot]; 
Các vấn đề liên quan