Динамический как аргумент функции - PullRequest
6 голосов
/ 18 апреля 2011

Mathematica предоставляет множество функций, которые способны обрабатывать Dynamic в качестве аргумента. Например, функция FileNameSetter имеет следующий вариант:

FileNameSetter[Dynamic[name]] 
 uses the dynamically updated current value of name, with the 
 value of name being reset if a different file is chosen.

Интересно, как можно определить шаблон функции, который принимает динамическое выражение в качестве аргумента. Например, вот одна попытка обернуть динамический вариант функции LocatorPane :

SinLocatorPane[Dynamic[sinvalue_]] := 
 LocatorPane[Dynamic[x, (x = #; sinvalue = Sin[First[#]]) &], 
             Plot[Sin[x], {x, 0, 10}]]

Какой правильный шаблон использовать для аргумента динамического выражения? Есть ли какие-либо предостережения с использованием динамического аргумента внутри определения функции?

1 Ответ

4 голосов
/ 18 апреля 2011

Если вы хотите написать функцию, которая обновляет значение определенной переменной, это похоже на передачу переменной по ссылке. Стандартный способ достижения этого в Mathematica - это использование Hold* атрибутов в вашей функции.

SetAttributes[SinLocatorPane, HoldFirst];
SinLocatorPane[sinvalue_] := 
 LocatorPane[Dynamic[x, (x = #; sinvalue = Sin[First[#]]) &], 
  Plot[Sin[x], {x, 0, 10}]]

Тогда

{Dynamic[sv], SinLocatorPane[sv]}

будет работать, как вы ожидали. Ваш код работал, потому что Dynamic имеет атрибут HoldFirst, и это позволило вашему коду обновлять переменную sinvalue. В противном случае Dynamic не был действительно необходим

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