Каков наилучший способ выбора совместимых параметров?


1

Как безопасно, эффективно и элегантно выбирать совместимые опции?

я обычно делаю

foo[opts:OptionsPattern[]] := Module[ 
    {goodOpts}, 
    goodOpts = FilterRules[{opts}, Options[bar][[All,1]]]; 
    bar[goodOpts] 
] 

Есть ли какая-нибудь лазейка, где это может вызвать ошибки?

Есть ли более эффективный и элегантный способ?

  0

Я не думаю, что есть разница между этим и 'goodOpts = FilterRules [{opts}, Options [bar]]', и назначение может быть выполнено в первом аргументе модуля. 23 авг. 132013-08-23 18:09:50

  0

Возможно, это дубликат [(353)] (http://mathematica.stackexchange.com/q/353/121), особенно мой ответ. 23 авг. 132013-08-23 20:03:20

  0

Также по причине, описанной специально в [(20470)] (http://mathematica.stackexchange.com/q/20470/121), вы должны использовать 'opts: OptionsPattern [{foo, bar}]' предполагается 'foo' сам принимает варианты. 23 авг. 132013-08-23 20:36:58

1

Я, мое мнение, это как раз путь. Как отметила Anon вы можете выполнить задание непосредственно в переменном списке Module, но в остальном он эквивалентен примеру, показанном в Setting Up Functions with Optional Arguments учебнике:

odeplot[de_, y_, {x_, x0_, x1_}, opts : OptionsPattern[]] := 
Module[{sol}, 
  sol = NDSolve[de, y, {x, x0, x1}, 
  FilterRules[{opts}, Options[NDSolve]]]; 
  If[Head[sol] === NDSolve, 
  $Failed, 
  Plot[Evaluate[y /. sol], {x, x0, x1}, 
  Evaluate[FilterRules[{opts}, Options[Plot]]]] 
  ] 
  ] 

Хорошей вещью FilterRules является то, что он работает даже с вложенные списки вариант, который часто можно в Mathematica

Plot[2 x, {x, 0, 1}, {ColorFunction -> Hue, {ColorFunctionScaling -> False}}] 

Это будет работать даже с вашим примером

foo[opts : OptionsPattern[]] := FilterRules[{opts}, Options[Plot]] 
foo[{ColorFunction -> Hue, {ColorFunctionScaling -> False, {MaxIterations -> 30}}}] 
  0

halirutan, чувствуете ли вы, что этот вопрос есть * не * дубликат? Я намерен закрыть его, но, поскольку вы считали, что он заслуживает ответа, я не хочу быть грубым. 23 авг. 132013-08-23 20:19:21

  0

@ Mr.Wizard Нет, я согласен с вами, но я хотел указать, что это точно так, как это предлагается в документации. Я бы не возражал, если вы закроете его, а затем люди все равно найдут здесь эту конкретную информацию * и * будет иметь ссылку на более общую тему о том, как настраивать функции с опциями. Можно ли закрывать вопросы всем? 23 авг. 132013-08-23 20:26:54

  0

Хорошо, я думаю, что сделаю это через некоторое время. (Это дает другим людям возможность изменить мнение или опубликовать ответ, если они будут склонны.) Да, закрытые или, по крайней мере, повторяющиеся вопросы должны быть видны всем и появляться в результатах поиска; это одна из их функций. 23 авг. 132013-08-23 20:33:54

  0

Документирование для 'FilterRules' говорит, что оно пытается сопоставляться с LHS: (« FilterRules [rules, patt] »фильтрует правила списка, выбирая только те правила, чьи левые стороны соответствуют патту. FilterRules [правила, {Subscript [patt, 1], Subscript [patt, 2], \ [Ellipsis]}] выбирает> правила, левые стороны которых соответствуют любому из подстрочных индексов [patt, i]. ") Так что не следует использовать be 'Sequence @@ FilterRules [{opts}, Options [f] [[All, 1]]]' вместо 'Sequence @@ FilterRules [{opts}, Options [f]]'? 26 авг. 132013-08-26 16:52:09

+1

@ red3y3 Да, но если вы посмотрите в разделе * Подробнее * документации к 'FilterRules', вы найдете следующее утверждение: * Если какой-либо из подстрочных индексов [patt, i] является правилом формы lhs-> rhs, то он обрабатывается так же, как и lhs. * Поэтому правила предоставления прав тоже работают. 26 авг. 132013-08-26 18:32:05