Пользовательские контроллеры для Manipulate [] в Mathematica - PullRequest
6 голосов
/ 13 января 2012

Я создал функцию test [], которая также может быть символьной проверкой, если это необходимо, и я пытаюсь реализовать ее в манипуляциях.test [] выглядит следующим образом:

test[]:=Button["Label",Functionality[]];

Возвращает ошибку, если используется непосредственно в манипуляторе [], но работает, если она заключена в динамический или оценочный.

Manipulate[content,test[]];

Manipulate :: vsform: Manipulate аргумент test [] не имеет правильной формы для спецификации переменной.

Manipulate[content,Dynamic[test[]]]

Этот работает

Manipulate[content,Evaluate[test]]

Обратите внимание, что хотя это работает, тест не является функцией

Manipulate[content,Evaluate[test[]]]

Это работает на моем Mac, но не на моем ПК на работе ...

Я думаю, что проблема связана сМанипулируйте им как HoldAll, но не понимайте, почему Dynamic [] должен это исправить.Кроме того, Evaluate [] будет работать только время от времени.

Итак, почему необходимы Dynamic [] или Evaluate []?Глядя в раздел пользовательских контроллеров учебника по расширенным манипуляциям, я не вижу ссылок на эту проблему и не могу найти нигде в другом месте.

1 Ответ

8 голосов
/ 13 января 2012

Вы можете встроить Button вместо использования отдельной функции test[].В противном случае в последнем примере Manipulate[content,Evaluate[test[]]], показывает кнопку на моем компьютере в Mathematica 8. Не должно быть никакой разницы между платформами (Windows или Mac).

Если вы делаетечто-то достаточно отличное от того, что Manipulate предоставляет по умолчанию, может оказаться более удобным построить его с нуля, используя Dynamic (это я обычно делаю).


Вот пример того, какчтобы включить некоторые кнопки в качестве контроллеров.

Сначала настройте что-то для отображения внутри Manipulate:

rotate90[{x_, y_}] := {-y, x}

koch[p1_, p2_, n_] := {koch[p1, p1 + (p2 - p1)/3, n - 1], 
  koch[p1 + (p2 - p1)/3, (p1 + p2)/2 + Sqrt[3]/6 rotate90[p2 - p1], 
   n - 1], koch[(p1 + p2)/2 + Sqrt[3]/6 rotate90[p2 - p1], 
   p2 - (p2 - p1)/3, n - 1], koch[p2 - (p2 - p1)/3, p2, n - 1]}

koch[p1_, p2_, 0] := Line[{p1, p2}]

snowflake[n_] := 
 Graphics[{koch[{0, 0}, {1, 0}, n], 
   koch[{1, 0}, {1/2, -Sqrt[3]/2}, n], 
   koch[{1/2, -Sqrt[3]/2}, {0, 0}, n]}]

Затем настройте сам Manipulate:

Manipulate[snowflake[n], {{n, 2}, ControlType -> None}, 
 Style["A Koch snowflake", Bold], Delimiter, 
 Row[{Button["+", n++], Button["-", n = Max[n - 1, 0]]}]]

Mathematica graphics


Вот пример, показывающий, что это работает, даже если Button определен в отдельной функции:

SetAttributes[paletteButton, HoldRest]
paletteButton[name_, func_] := 
 Button[name, func, Appearance -> "Palette"]

Manipulate[snowflake[n], {{n, 2}, ControlType -> None}, 
 Style["A Koch snowflake", Bold], Delimiter, 
 Evaluate@paletteButton["+", n++]]

Как вы упоминали в своем вопросездесь необходимо обернуть функцию в Evaluate для получения встроенного Button.В противном случае Manipulate не сможет заметить, что у нас есть элемент управления , а не переменная .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...