Wolfram mathematica 操作、动态、刷新的初始化问题

Wolfram mathematica 操作、动态、刷新的初始化问题,wolfram-mathematica,Wolfram Mathematica,我在操作中使用以下模式 Dynamic[Refresh[....logic to handle v changes...., TrackedSymbols->{v}]] 在建立逻辑时 我使用上面的代码来表示“事件处理程序”,其中“v”是用户更改的控制变量。因此,当一个特定的控制变量发生变化时,有特定的代码来处理处理这个变化的变量所需的逻辑。这模拟了其他GUI编程系统中的“回调” 这很有效。除了在初始化时,因为当操纵首次出现在屏幕上时,操纵将“触发”这些刷新,即使我不更改幻灯片 此外,它决

我在操作中使用以下模式

Dynamic[Refresh[....logic to handle v changes...., TrackedSymbols->{v}]]
在建立逻辑时

我使用上面的代码来表示“事件处理程序”,其中“v”是用户更改的控制变量。因此,当一个特定的控制变量发生变化时,有特定的代码来处理处理这个变化的变量所需的逻辑。这模拟了其他GUI编程系统中的“回调”

这很有效。除了在初始化时,因为当操纵首次出现在屏幕上时,操纵将“触发”这些刷新,即使我不更改幻灯片

此外,它决定“触发”刷新的顺序也不能依赖。这使得初始化程序状态变得困难

这里有一个例子

Manipulate[

 Row[{
   Dynamic[Refresh[Print["x changed"]; {x, y, z}, TrackedSymbols -> {x}]],
   Dynamic[Refresh[Print["y changed"];  "", TrackedSymbols -> {y}]],
   Dynamic[Refresh[Print["z changed"];  "", TrackedSymbols -> {z}]]
   }
  ]
 ,
 {{x, 1, "x"}, 0, 10},
 {{y, 1, "y"}, 0, 10},
 {{z, 1, "z"}, 0, 10}
 ]
如果您运行上述命令,您将注意到出现3条打印消息,而不触摸控件

我的问题:有没有办法防止这种初始刷新?我希望在实际使用滑块更改变量时运行刷新代码

您可能会说,有什么大不了的,让它先刷新,然后运行逻辑,就好像用户确实更改了变量一样

是的,我现在这样做。但我正试图通过减少不必要的工作来提高效率。因为每次控制变量发生变化时,代码都会运行一些长时间的计算,这使得操纵比第一次出现时需要更多的时间,因为每个控制变量中的计算必须运行一次

我可以引入一个额外的“状态变量”来控制它,并在开始实际工作之前通过计数检查所有事件是否“触发”了一次。一旦所有事件触发一次,我就可以将这个变量设置为True,并且只有当事件触发并且这个状态变量也是True时才运行真正的代码

但我想问,是否有一种内置方式或更智能的方式来处理这个问题,而不在代码中引入更复杂的逻辑,因为我找不到一个选项或设置来处理这个问题


谢谢,

所以,这并不是一般性的,也不美观,只是一种变通方法,但它可以满足您的需要:

  Manipulate[Module[{refx, refy, refz}, 
   If[{x,y,z} == {1,1,1}, {x, y, z}, 
    Row[{Dynamic[Refresh[
        Print["x changed"]; 
         {x, y, z}, TrackedSymbols -> 
         {x}]], Dynamic[Refresh[
        Print["y changed"]; "", 
        TrackedSymbols -> {y}]], 
      Dynamic[Refresh[
        Print["z changed"]; "", 
        TrackedSymbols -> {z}]]}]]], 
  {{x, 1, "x"}, 0, 10}, 
  {{y, 1, "y"}, 0, 10}, 
  {{z, 1, "z"}, 0, 10}]

如果我第一次运行你的示例,我甚至会收到6条打印消息。你是对的,它打印6次,而不是3次。试图弄清楚这是为什么总是很有趣的。换句话说,在使用操纵之前,操纵的表达式最初被评估了2次。感谢您的解决方案,尽管我不能使用它。它使用SetAttributes,这是演示中不允许使用的符号。顺便说一句,这是我的错误,我应该在前面提到,关于SetAttribute。演示中不允许使用许多函数和符号(不生成CDF)。出于安全原因,我修好了。但是为什么要使用CDF呢?我更喜欢webMathematica。@Rolf我想说CDF和webMathematica是两个不同的世界:一个客户端,另一个服务器端,一个免费下载,另一个buyware,一个是Mathematica的简单保存,另一个???@Sjoerd有webMathematica的免费业余许可证。诚然,制作一个webMathematica站点需要做更多的工作,但根本没有什么可下载的!只是浏览器。(无耻的广告:我将在下个月的会议上发表关于webMathematica项目的演讲)。