我的手上有一个非常大的问题.
我花了一周的时间重写一个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}]
今晚对我来说就是这样.也许其他人可以提供一些建议.