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