当变量更改时,操作更新表达式,而不是在TrackedSymbols上

时间:2011-09-05 12:12:23

标签: wolfram-mathematica

我放弃了这个。可能有人可以看到明显的东西。

我有一个触发器,可以在点击时更新变量'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秒后,表达式开始自动更新,单元格的右侧显示它正忙,这是没有我按下运行按钮或触摸任何东西。动力学在工作中的魔力:)

enter image description here

接下来,我将变量'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的工作原理。点击触发器上的“重置”似乎并没有阻止它滴答作响?我现在真的很困惑。

1 个答案:

答案 0 :(得分:4)