Re: How to find which variable caused the trigger in Manipulate[]
- To: mathgroup at smc.vnet.net
- Subject: [mg103821] Re: How to find which variable caused the trigger in Manipulate[]
- From: "Nasser Abbasi" <nma at 12000.org>
- Date: Thu, 8 Oct 2009 07:49:43 -0400 (EDT)
- References: <hafbgr$j4r$1@smc.vnet.net>
"Nasser Abbasi" <nma at 12000.org> wrote in message news:hafbgr$j4r$1 at smc.vnet.net... >> 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 Manipulate[ (* 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[...]] allowed. Here is a small code to show the problem Manipulate[ 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: Manipulate[ Which[ 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, --Nasser