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

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

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

但是,当我开始时我不知道如何将它们定义为无控制类型(以便在每个Manipulate更新之间保存状态),所以,我现在将它们移动到初始化部分,以便我可以测试这个想法.

一切都很好,除了一个问题:

在初始化部分,它们变为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}
 ]

但我不知道如何制作上述内容.我需要使用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

以下是在上述情况不明确的情况下更明显的问题示例

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

问题是,控制无语法不允许我输入

{{p@x,0},None}

希望这个例子能让事情更加清晰.

最佳答案 有一点需要注意,我大多只使用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}]

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

点赞