MathGroup Archive 2009

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

Search the Archive

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

  • To: mathgroup at
  • Subject: [mg103821] Re: How to find which variable caused the trigger in Manipulate[]
  • From: "Nasser Abbasi" <nma at>
  • Date: Thu, 8 Oct 2009 07:49:43 -0400 (EDT)
  • References: <hafbgr$j4r$>

"Nasser Abbasi" <nma at> wrote in message 
news:hafbgr$j4r$1 at

>> Again, I want something like this
>> Manipulate[
>> process[( pickTheCorrectControlVariableWhichChanged ],
>> {a, 0, 1}, {b, 0, 1}, Initialization :>
>>   (process[arg_] := Module[{}, Plot[Sin[arg*x], {x, -Pi, Pi}]])
>> ]

> I made some progress and I think I have a solution.
> I save the old value of each control variable in a global variable, then 
> in
> the Manipulate expression, I check, using an If statement which current
> value of the control variable is different from the old value. I got it to
> work ok finally.
> Here is an example:
> olda = 999;
> oldb = 999;
> Manipulate[
>   If[olda != a, {olda = a; Style[StringJoin["a=", ToString[a]]]},
>   If[oldb != b, {oldb = b; Style[StringJoin["b=", ToString[b]]]},
>    Text["this message should NOT show up!"]]], {a, 0, 1}, {b, 0, 1},
>  LocalizeVariables -> True, TrackedSymbols -> {a, b}]

It is me again, with the same problem.

I found out that I can NOT use global variables in a demo, and I also can't 
wrap the whole Manipulate inside a module. Any one of the above method will 
have solved this problem, but rules are rules, so now I have to find another 
solution.  So I am stuck again.

Before I recode everything again, which I would hate to do, I thought I'll 
ask one more time, may be some expert can have a solution. But this one is 
really hard.

I'll explain again the problem to make sure we are all clear on it.

I need to write a Manipulate where inside the Manipulate I need to detect 
which slider or in other words, which control variable was changed. i.e. 
which slider the user just changed to cause the Manipulate expression to be 
generated. (I need to do this so I can do different processing based on the 
slider that was selected)

We all know that Manipulate generates a new version of its expression when 
one of the control variables changes value.  I need to know which control 
variable changed.

There is the general layout


  (*   expression that uses control variables *)


  (* controls here which update the control variables values *)

But there are restriction on the solution, since this will be for a demo. 
Again, there can NOT be global variables used, (i.e. no variables in the 
Manipulate initialization section, since these are global), and there can 
NOT be a module around Manipulate[], i.e. no  Module[{...}, Manipulate[...]] 

Here is a small code to show the problem

    Text[StringJoin["you moved the ", "x or y", " slider"]],
   {x, 0, 1},
   {y, 0, 1}

Could someone modify the above, so that the code above will tell which 
slider the user _just_ moved?

It seems like an impossible problem for me to solve without the use of 
global variables or a module around Manipulate.

Here is what I tried so far, and this fail:


   x != oldx,
   {oldx = x; Text[StringJoin["you moved the ", "x ",  " slider"]]},

   y != oldy,
   {oldy = y; Text[StringJoin["you moved the ", "y ", " slider"]]},

   True, Text["why Ami here??"]

  {x, 0, 1},
  {y, 0, 1},
  {oldx, -999,  ControlType -> None},
  {oldy, -999,  ControlType -> None}

The reason it fail is because oldx and oldy are updated to the same value of 
x and y whenever x or y changes before I get the chance to do the 
comparison. I.e. when the new version of the expression is generated, oldx=x 
and oldy=y each time.  This seems to consequences of Manipulate generating 
DynamicModule[] for the whole thing. You can see this by using the SnapShot 
option on the Manipulate output. This will generate the whole expression 
form. (Nice tool).

If someone can make it so that the above will display the correct message 
each time, then I would declare that person to be the Mathematica Guru of 
the year.

I think I have reached the limit of my current Mathematica understanding 
when it comes to internals of Manipulate and Dynamics to be to solve this 
one. But I'll keep on looking.

Thank you,

  • Prev by Date: Re: Re: generating submultisets with repeated elements
  • Next by Date: Re: Re: Re: generating submultisets with
  • Previous by thread: Re: How to find which variable caused the trigger in Manipulate[]
  • Next by thread: Re: Re: How to find which variable caused the trigger in Manipulate[]