У меня действительно большая проблема на руках.
Я провожу неделю, переписывая демо-версию Manipulate для использования индексированных объектов (чтобы использовать их в качестве эмуляции структуры)
Однако, когда я начал, я не знал, как определить их как тип None control
(чтобы состояние сохранялось между каждым обновлением Manipulate), поэтому я переместил их в раздел «Инициализация», чтобы я мог проверить идею.
Все работает хорошо, кроме одной проблемы:
В разделе Инициализация они становятся ГЛОБАЛЬНЫМИ. Это означает, что при создании демонстрации и моментального снимка Манипулятора, который нужно сделать, тогда 2 Манипулятора теперь будут взаимодействовать друг с другом нежелательным образом. Они разделяют эти глобальные переменные (индексируемые объекты). Это означает, что если я что-то изменю в одном манипуляторе, это повлияет на другой манипулятор.
Демонстрационный редактор WRI также не рекомендует использовать глобальные переменные внутри секции Manipulate.
Я объясню проблему на простых примерах и надеюсь, что специалист здесь знает обходной путь. В настоящее время у меня есть что-то вроде этого, который работает:
Manipulate[
p@x = 0; (*I'd like to use here *)
p@y = 99; (*etc...*)
foo,
{{foo, 0, "foo"}, 0, 10, 1},
Initialization :>
{
p[x] = 99; (*my data live here *)
p[y] = 0; (*my data live here *)
}
]
Но в приведенном выше примере p [x] и p [y] являются глобальными. Я попробовал контрольный трюк Нет, но это не работает:
Manipulate[
p[x] = 0;
foo,
{{foo, 0, "foo"}, 0, 10, 1},
{{p[x], 99}, None} (* syntax error, what is the correct syntax? *)
]
Я не могу поместить Модуль вокруг Манипуляции, чтобы использовать его для сохранения состояния. Не допускается.
Итак, мне нужен способ, чтобы эти индексируемые объекты сохраняли состояние между каждым обновлением Manipulate, как переменная управления, но не были глобальными.
Но проблема, я не знаю, как это сделать. Единственный способ, которым я знал, это использовать трюк Control None.
Я знаю, что Манипулирование - это, по сути, DynamicModule[]
. Вот почему его собственные переменные (управляющие переменные) сохраняют состояние. Мне нужно, чтобы эти проиндексированные объекты были похожи на них. Могу ли я использовать DynamicModule [] внутри Manipulate для этого или есть простое решение?
Кстати, я обнаружил, что могу сделать следующее
Manipulate[
z,
{{foo, 0, "foo"}, 0, 10, 1},
{{z, p[x]}, None}
]

Но я не уверен, что из вышеперечисленного делать. Мне нужно использовать p @ x, а не z.
Странно, можно определить массив проиндексированных объектов, но не один?
Manipulate[
z,
{{foo, 0, "foo"}, 0, 10, 1},
{{z, Table[p[i], {i, 5}]}, None}
]

Спасибо за любые подсказки.
Обновление:
Я не могу заставить приведенный ниже ответ Майка работать так, как мне было нужно. Например, предположим, что я хочу, чтобы p [x] инициализировался в 0, а затем в каждом обновлении Manipulate я хочу добавить один к нему. Как это сделать? Вот что я попробовал:
Manipulate[
DynamicModule[{p, x}, (*not working *)
p@x = p@x + 1;
p@x,
Initialization :>
{
p@x = 0;
}
],
{{n, 0, "n"}, 0, 10, 1},
TrackedSymbols :> n
]
Будет продолжать пытаться что-то ...
Обновление 2:30 AM
Ниже приведен более ясный пример проблемы в случае, если вышеприведенное неясно
Manipulate[
p@x = p@x + 1;(*I'd like to use here*)
n;
Row[{"p@x=", p@x}],
Button["click to update p@x", n++],
{{n, 0}, None},
TrackedSymbols :> {n},
Initialization :> {
p@x = 0;
}
]

В этом примере индексированный объект, p [x], является глобальной переменной, поэтому его состояние сохраняется. Мне нужно сделать то же самое, но без определения p [x] как глобального, но переместить его как часть Манипуляции, чтобы он стал локализованным, но также сохранял свое состояние.
Снова проблема в том, что синтаксис control None
не позволяет мне набирать
{{p@x,0},None}
Надеюсь, этот пример прояснит ситуацию.