我放弃了这个。可能有人可以看到明显的东西。
我有一个触发器,可以在点击时更新变量'time'。
接下来,我设置了TrackedSymbols-> {time},期望仅重新评估Manipulate的表达式“时间”变化。
但我发现通过更改另一个不在TrackedSymbols列表中的变量,表达式也在更新。
这是一个例子
Manipulate[
(
If[time == 0, n = 0];
Print[DateString[]];
n
),
{{time, 0, "run"}, 0, 20, AnimationRate -> 1, ControlType -> Trigger},
{{n, 0}, None},
TrackedSymbols -> {time}
]
上述作品是预期的。单击运行时,单击“暂停”,然后单击“重置”,一切正常,表达式仅在触发器“正在运行”时更新。
现在我添加这一行,所以上面变成了
Manipulate[
(
If[time == 0, n = 0];
Print[DateString[]];
n=n+1; (* ADD THIS *)
n
),
{{time, 0, "run"}, 0, 20, AnimationRate -> 1, ControlType -> Trigger},
{{n, 0}, None},
TrackedSymbols -> {time}
]
现在,我和以前一样,单击“运行”,然后暂停,然后重置。由于重置触发器,因此预计表达式不会更新。即“时间”变量没有变化。
但是在点击重置3-4秒后,表达式开始自动更新,单元格的右侧显示它正忙,这是没有我按下运行按钮或触摸任何东西。动力学在工作中的魔力:)
接下来,我将变量'n'向下移动到Initialization部分,现在问题就消失了:
Manipulate[
(
If[time == 0, n = 0];
Print[DateString[]];
n = n + 1;
n
),
{{time, 0, "run"}, 0, 20, AnimationRate -> 1, ControlType -> Trigger},
TrackedSymbols -> {time},
Initialization :>
(
n = 0;
)
]
现在它不会像以前一样自行更新。
我的问题是:为什么当'n'被写为{{n, 0}, None}
时,Manipulate存在上述问题?我总是想通过使用TrackedSymbols
,只有那些符号在更改值时才会操作更新表达式。
我确信这有一个简单的原因,但经过一个小时后,我看不到它。有时我认为我永远不会完全理解Mathematica Dynamic []。
感谢您的任何解释。
更新
我认为问题出在Trigger本身。我必须不了解Trigger的工作原理。点击触发器上的“重置”似乎并没有阻止它滴答作响?我现在真的很困惑。