Re: Re: How to find which variable caused the trigger in Manipulate[]
- To: mathgroup at smc.vnet.net
- Subject: [mg104159] Re: [mg104136] Re: How to find which variable caused the trigger in Manipulate[]
- From: "Nasser M. Abbasi" <nma at 12000.org>
- Date: Wed, 21 Oct 2009 06:31:22 -0400 (EDT)
- References: <2009102020541.263124@jfultz2winlap>
- Reply-to: "Nasser M. Abbasi" <nma at 12000.org>
From: "John Fultz"
"Now this code has the distinct advantage that it works, and it's not so
complicated, but there's one fatal flaw in it. It relies on the same
undocumented assumption I discussed earlier...that Dynamics are validated
left-to-right. It would fall down if you flipped the order of the Row[], or in
a hypothetical future implementation of Dynamic that violates this
assumption.
So that's not my final solution. But I wanted you to see this so you could
understand better how I built my final solution. My final solution takes
the
same approach, but tracks the Dynamics as they're initialized, forcing the
Text[] Dynamic to evaluate (possibly again) after the others. The solution
doesn't seem very elegant, but it does work. I'm afraid that the
educational
value of this example will require some study of the code, but you seem
willing
to do that. I reversed the Row[] in this example to prove that it does, in
fact, work as advertised.
Manipulate[Row[{
Dynamic[Refresh[
Switch[dynamicsInitialized,
{True, True, False}, dynamicsInitialized[[3]] = True;r = initialState,
{True, True, True}, initialState = r];
Text[r], TrackedSymbols -> {y, x, dynamicsInitialized}]],
Dynamic[Refresh[dynamicsInitialized[[1]] = True; r = x;
"",TrackedSymbols -> {x}]],
Dynamic[Refresh[dynamicsInitialized[[2]] = True; r = y;
"",TrackedSymbols -> {y}]]}
],
{x, 0, 1, 0.01},
{y, 0, 1, 0.01},
{r, "", "", ControlType -> None},
{{initialState, 0}, ControlType ->None},
{{dynamicsInitialized, {False, False, False}}, ControlType -> None},
Initialization :> (dynamicsInitialized = {False, False, False})
]
"
Brilliant John as always.
Studying your code, I just learned something I never knew about Manipulate,
which is probably why I could not come up with a solution.
I was wondering, since in the code above, dynamicsInitialized variable is
initialized to {False, False, False}, then, assuming does not "touch" the
"y" slider at all the whole time, then how could the Switch statement, which
checks only for {True, True, False} and {True, True, True}, ever gets
executed?
Since only when the "y" slider is moved, would you set the
dynamicsInitialized[[2]] to true.
Yet, when I look at the DynamicModule[] code generated by the hitting the
"Paste snapshot" button in the corner of the Manipulate display, it says
that dynamicsInitialized has the value {True, True, True} each time ! But
how could it be so, I have not even touched the "y" slider! even if I do not
touch the "x" slider, this variable will have this value.
But when I click the "initial settings" button, then look at the "Paste
snaphot", then I see this variable having the value {False, False, False}.
I came up with a theory on how this could be:
Just by the act of displaying the Manipulate result on the screen, or
scrolling over it, all the control variables will be "activated", or
"triggered" initially, even when one has not physically moved the slides/the
controls yet.
This means there will be some initial evaluations of the Manipulate
expression. 3 initial evaluations that occur behind the scene before I ever
get to touch the sliders.
The first evaluation detects that "x" is triggered (or maybe "y", since the
order is not defined), so this will cause dynamicsInitialized to become
{True, False, False}.
The second evaluation will detect that "y" control variable is triggered, so
now dynamicsInitialized becomes {True, True, False}.
And now in the third evaluation, since dynamicsInitialized is being tracked
also, and it has changed from the above evaluations, then now and only now,
would one of the Switch statement conditions be used, the one which checks
for {True, True, False}.and this will finally cause dynamicsInitialized
becomes {True, True, True}. And now the rest will follow as the user moves
the "x" or the "y" slides.
Thanks again for your help John.
--Nasser