我的手上有一个非常大的问题。
我花了一周时间重写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}
]
但我不知道如何解决上述问题。我需要使用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的一部分,以便它变得本地化,但也保存了它的状态。
问题是,control None
语法不允许我输入
{{p@x,0},None}
希望这个例子能让事情更清楚。
答案 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}]
今晚对我来说就是这样。也许其他人可以提供一些建议。