Services & Resources / Wolfram Forums / MathGroup Archive
-----

MathGroup Archive 2009

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Re: How to find which variable caused the trigger in Manipulate[]

  • To: mathgroup at smc.vnet.net
  • Subject: [mg103895] Re: [mg103821] Re: How to find which variable caused the trigger in Manipulate[]
  • From: "Nasser Abbasi" <nma at 12000.org>
  • Date: Sun, 11 Oct 2009 08:05:54 -0400 (EDT)
  • References: <200910916541.056199@jfultz2winlap>
  • Reply-to: "Nasser Abbasi" <nma at 12000.org>

"This is a very simple version of what you asked for that doesn't solve some of
the fundamental problems you'll probably come across, but it shows you the
techniques to solving them.  Principally...

* Contain all evaluation inside of scoped Dynamics to prevent the entire
Manipulate from refreshing.
* Add flag variables (and perhaps you'll want other variables, too) as control
variables, but with ControlType->None so they don't appear.
* Use separate Dynamics, which display inside a Row[] as empty strings (this is
important...remember that if a Dynamic doesn't display onscreen, then there's
nothing available to update...see my previous posts on Dynamic if you're at all
confused about this), to track the individual variables.
  + These separate Dynamics each scope a single variable only.
  + The scoped variable is determined by using Refresh with TrackedSymbols

One of the problems my version doesn't solve is sensibly setting a start
condition, so the evaluation assumes that the initial state has changed the y
parameter (as a result of the initial creation of the flag-tracking dynamics).
That's a problem I'll let you figure out.


Manipulate[Row[{
   Dynamic[
    Refresh[xFlag = True; yFlag = False; "", TrackedSymbols -> {x}]],
   Dynamic[
    Refresh[xFlag = False; yFlag = True; "", TrackedSymbols -> {y}]],
   Dynamic[
    Text[StringJoin["you moved the ", Which[xFlag, "x", yFlag, "y"],
      " slider"]]]
   }],
 {x, 0, 1}, {y, 0, 1},
 {{xFlag, False}, ControlType -> None},
 {{yFlag, False}, ControlType -> None}]


Sincerely,

John Fultz"



Fantastic John.

The Dynamic[Refresh[....., TrackedSymbols->{...}]] is the construct I was 
looking for. This tells me which controls have changed.  I've looked at 
Refresh[] sometime ago, but must have looked at only its interval option and 
overlooked its other option which is TrackedSymbols.

I have implemented the solution as I showed before using lots of flags which 
I was checking for inside Manipulate.

But with the above method you showed is much better, and I have recoded the 
whole demo using this method, cutting the code size by 50% and making the 
logic much simpler.

There is one thing still not clear to me. If you look at the following 
example I just wrote:

Manipulate[

     Row[{
       Dynamic[Refresh[r = process["x "]; "", TrackedSymbols -> {x}]],
       Dynamic[Refresh[r = process["y "]; "", TrackedSymbols -> {y}]],
       Dynamic[Refresh[Text[r], TrackedSymbols :> {x, y, r}]]}
     ],

    {x, 0, 1},
    {y, 0, 1},
    {r, "", "", ControlType -> None},

    Initialization :>
          (process[s_String] := Module[{},Text[StringJoin[s, 
DateString[]]]])
]

The above works as I wanted. When the x or the y slider is moved, the code 
detects which one and shows the corresponding message.

However, what I do not understand is why I had to write

       Dynamic[Refresh[Text[r], TrackedSymbols :> {x, y, r}]]}

instead of just

       Dynamic[Refresh[Text[r], TrackedSymbols :> {x, y}]]}

For it to work? i.e. why do I have to add "r" to the list of symbols to 
track? Since it must be that either 'x' or 'y' must have changed by the time 
the code reaches this line, and so it should have been enough to just check 
for ANY of these 2 control variables to have changed. But I find that I have 
to also check for "r" being changed for the message to appear, i.e. for 
Text[r] to be executed.

Is TrackedSymbols :> {x, y} in the context of Dynamic[Refresh[expr,...]], 
supposed to mean that if ANY one of these control variables changed then 
evaluate expr ?

Thank you again, your help was very valuable.

--Nasser








  • Prev by Date: Re: Google Trends Data and Mathematica
  • Next by Date: Re: How to find the machine number nearest to an exact
  • Previous by thread: Re: Re: Re: How to find which variable caused
  • Next by thread: Re: Re: How to find which variable caused the trigger in Manipulate[]