Wolfram mathematica 当变量更改时(不在其TrackedSymbols上)操纵更新表达式

Wolfram mathematica 当变量更改时(不在其TrackedSymbols上)操纵更新表达式,wolfram-mathematica,Wolfram Mathematica,我放弃了这个。也许有人能看到一些明显的东西 我有一个触发器,当点击时它会更新变量“time” 接下来,我设置TrackedSymbols->{time},希望操纵的表达式只重新计算“time”更改 但我发现,通过更改另一个变量(不在TrackedSymbols列表中),表达式也在更新 这里有一个例子 Manipulate[ ( If[time == 0, n = 0]; Print[DateString[]]; n ), {{time, 0, "run"}, 0, 20, A

我放弃了这个。也许有人能看到一些明显的东西

我有一个触发器,当点击时它会更新变量“time”

接下来,我设置TrackedSymbols->{time},希望操纵的表达式只重新计算“time”更改

但我发现,通过更改另一个变量(不在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}
 ]
现在,我和以前一样,单击“运行”,然后暂停,然后重置。由于触发器已重置,预期表达式不会更新。i、 e.“时间”变量不变

但是在按下重置键3-4秒后,表达式开始自动更新,单元格右侧显示它正忙,而我没有按下运行按钮或触摸任何东西。动力的魔力在起作用:)

接下来,我将变量“n”向下移动到初始化部分,现在问题消失了:

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}
时,操纵会出现上述问题?我一直认为,通过使用
TrackedSymbols
,只有那些更改了值的符号才会更新表达式

我相信这有一个简单的原因,但经过一个小时的讨论,我看不出来。有时我想我永远都不会完全理解数学的动态性

谢谢你的解释

更新:


我认为问题在于触发器本身。我一定不明白触发器是怎么工作的。在触发器上单击“重置”似乎不会阻止它滴答作响?我现在真的很困惑。

试试。

谢谢西蒙!到目前为止,我可能花了4个小时在这上面,但从未注意到这一点。我现在看到,在->vs.:>的文档中确实提到“通常,RuleDelayed应该始终用于TrackedSymbol”。奇怪的是,我总是使用TrackedSymbols->,它从来没有给我带来任何问题。我一定一直很幸运。我将把它添加到Mathematica的“注意事项列表”的顶部,这一列表现在已经很长了:)。