如何在Manipulate中使用索引对象,以便将其状态保存为其他动态?

时间:2011-12-17 06:48:29

标签: wolfram-mathematica

我的手上有一个非常大的问题。

我花了一周时间重写Manipulate演示以使用索引对象(将它们用作结构的模拟)

然而,当我开始时我不知道如何将它们定义为None control类型(以便在每个Manipulate更新之间保存状态),因此,我现在将它们移动到Initialization部分,以便我可以测试这个想法。

除了一个问题外,一切都很顺利:

在初始化部分,它们变为GLOBAL。这意味着,在制作演示时,以及制作Manipulate的快照时,必须进行操作,那么2 Manipulate现在将以不期望的方式彼此交互。它们共享这些全局变量(索引对象)。这意味着如果我在一个Manipulate中更改了某个内容,则另一个Manipulate会受到影响。

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周围以便使用它来保存状态。不允许。

因此,我需要一种方法让这些索引对象保持每个Manipulate更新之间的状态,就像控制变量一样,但不是全局的。

但问题我不知道怎么做。我知道这样做的唯一方法是使用Control None技巧。

我知道Manipulate本身基本上是DynamicModule[]。这就是为什么它自己的变量(控制变量)保持状态。我需要这些索引对象也像它们一样。我可以在Manipulate中使用DynamicModule []以某种方式执行此操作,还是有一个简单的解决方案?

是的,我发现我可以做以下事情

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

以下是上述情况不明确时问题的更明确的例子

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]定义为全局,但是将它移动到Manipulate的一部分,以便它变得本地化,但也保存了它的状态。

问题是,control None语法不允许我输入

{{p@x,0},None}

希望这个例子能让事情更清楚。

1 个答案:

答案 0 :(得分:2)

有一点需要注意,我大多只使用DynamicModule,很少使用Manipulate,所以我不熟悉你如何将它折磨成提交,我认为这可能有用:

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}]

如果它不能按照您的要求运行,您可能需要提供更多信息或等待Manipulate人回复。

修改

刚刚添加了一个动态替代品。因此,在您的真实代码中,例如p或x或y将被更新,然后您需要使用动态。 (上面的例子假设x是动态的)

进一步编辑

您最近的编辑意味着您希望p值在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}]

今晚对我来说就是这样。也许其他人可以提供一些建议。