Как использовать индексированный объект внутри Манипуляции, чтобы его состояние сохранялось как другая динамика? - PullRequest
4 голосов
/ 17 декабря 2011

У меня действительно большая проблема на руках.

Я провожу неделю, переписывая демо-версию 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}
 ]

enter image description here

Но я не уверен, что из вышеперечисленного делать. Мне нужно использовать p @ x, а не z.

Странно, можно определить массив проиндексированных объектов, но не один?

Manipulate[
 z,
 {{foo, 0, "foo"}, 0, 10, 1},
 {{z, Table[p[i], {i, 5}]}, None}
 ]

enter image description here

Спасибо за любые подсказки.

Обновление:

Я не могу заставить приведенный ниже ответ Майка работать так, как мне было нужно. Например, предположим, что я хочу, чтобы 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;
   }
 ]

enter image description here

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

Снова проблема в том, что синтаксис control None не позволяет мне набирать

{{p@x,0},None}

Надеюсь, этот пример прояснит ситуацию.

1 Ответ

2 голосов
/ 17 декабря 2011

С оговоркой, что я в основном использую только DynamicModule, редко манипулирую, поэтому я не знаю, как вы пытаете его в подчинении, я думаю, это может сработать:

Manipulate[
 DynamicModule[{p, x, y},

  p@x = 0;
  p@y = 99;

  p[y]*foo (* or Dynamic[p[x]*foo] *)],

 {{foo, 0, "foo"}, 0, 10, 1}]

Если это не работает так, как вам нужно, вам может потребоваться предоставить дополнительную информацию или подождать, пока парень из Манипуляций ответит.

Редактировать

Только что добавили альтернативу с динамикой. Так в вашем реальном коде, например, p или x или y должны быть обновлены, тогда вам нужно использовать Dynamic. (В приведенном выше примере предполагается, что x является динамическим)

ДОПОЛНИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ

Ваше последнее редактирование подразумевает, что вы хотите, чтобы p @ x изменялось при изменении значения n, например когда ползунок перемещается.

Manipulate[
DynamicModule[{p, x, tmp},
  p@x = 0;

  {Dynamic[p@x += 1; n, TrackedSymbols :> {n}], Dynamic[p@x]}],

 {{n, 0, "n"}, 0, 10, 1}]

Это для меня сегодня вечером. Может быть, кто-то еще может предложить некоторые предложения.

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