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

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: [mg103903] Re: [mg103879] Re: [mg103821] Re: How to find which variable caused
  • From: DrMajorBob <btreat1 at austin.rr.com>
  • Date: Mon, 12 Oct 2009 06:36:00 -0400 (EDT)
  • References: <20091011164313.476926@jfultz2winlap>
  • Reply-to: drmajorbob at yahoo.com

Right you are. My bad.

Bobby

On Sun, 11 Oct 2009 16:43:13 -0500, John Fultz <jfultz at wolfram.com> wrote:

> I was quite explicit about this in my previous email...
>
>>> * Use separate Dynamics, which display inside a Row[] as empty strings
>
> I.e., the Row is scoping two empty strings and the Text[].  Replacing  
> Row with
> Column makes empty space because empty strings take up a full line  
> height in a
> Column.  The controls come from the surrounding Manipulate, and so  
> nothing
> inside the Row is displaying as a column.
>
> Sincerely,
>
> John Fultz
> jfultz at wolfram.com
> User Interface Group
> Wolfram Research, Inc.
>
>
> On Sun, 11 Oct 2009 14:30:22 -0500, DrMajorBob wrote:
>> 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: How to find which variable caused the trigger in Manipulate[]
  • Next by Date: Re: Re: Re: Re: Re:
  • Previous by thread: Re: Why init.m is not being loaded from Autload folder? [Mathematica 7]
  • Next by thread: trading