MathGroup Archive 2009

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

Search the Archive

Re: Re: Re: How to find which variable caused

  • To: mathgroup at smc.vnet.net
  • Subject: [mg103913] Re: [mg103879] Re: [mg103821] Re: How to find which variable caused
  • From: DrMajorBob <btreat1 at austin.rr.com>
  • Date: Mon, 12 Oct 2009 06:37:52 -0400 (EDT)
  • References: <200910101109.HAA12701@smc.vnet.net>
  • Reply-to: drmajorbob at yahoo.com

Why does that Row display as a column? (Even when I stretch the window  
over two monitors.)

Replacing Row with Column gives the same result, except that there's a lot  
of excess space in the Text box... even when I specify 0 as the 3rd  
argument, as in

Manipulate[
  Column[{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"]]]}, Left, 0], {x, 0, 1}, {y, 0, 1}, {{xFlag, False},
   ControlType -> None}, {{yFlag, False}, ControlType -> None}]

Why is that?

Bobby

On Sat, 10 Oct 2009 06:09:45 -0500, John Fultz <jfultz at wolfram.com> wrote:

> 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
> jfultz at wolfram.com
> User Interface Group
> Wolfram Research, Inc.
>
>
> On Thu, 8 Oct 2009 07:49:43 -0400 (EDT), Nasser Abbasi wrote:
>>
>>
>> "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
>
>
>


-- 
DrMajorBob at yahoo.com


  • Prev by Date: Re: Re: Re: undocumented feature: TableView
  • Next by Date: Re: Re: Re: How to find which variable caused the trigger in Manipulate[]
  • Previous by thread: Re: 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[]