Re: Dynamic changing of variables

*To*: mathgroup at smc.vnet.net*Subject*: [mg96344] Re: Dynamic changing of variables*From*: Albert Retey <awnl at gmx-topmail.de>*Date*: Thu, 12 Feb 2009 06:34:07 -0500 (EST)*References*: <gmu8rl$gn3$1@smc.vnet.net>

Hi, > DynamicModule[{a, b = 0}, > a = Dynamic[Sin[b]]; > Column[{ > Dynamic[a], > Slider[Dynamic[b], {0, 2*Pi}] > }] > ] > In order to update "a" with the actual value of Sin[b] I need > Dynamic around it. Unfortunately, now the variable "a" is invisibly > wrapped and completely useless for further calculations. I'm not able to > calculate even a+1 inside the DynamicModule. > > DynamicModule[{a, b = 0}, > a = Dynamic[Sin[b]]; > Column[{ > Dynamic[a+1], > Slider[Dynamic[b], {0, 2*Pi}] > }] > ] > > If I'm not just too stupid and this behaviour is intended, then I'm > wondering whether this doesn't lead to problems when you have more > complex constructs with several dynamic variables. You need to understand that Dynamic is something that only starts its magic when it is shown within the FrontEnd. So this: a = Dynamic[Sin[b]]; is assigning the Dynamic (actually a DynamicBox) to a, something that only makes sense for the FrontEnd, not the Kernel. What you really want is not to assign a to Dynamic[Sin[b]] but you want to assign Sin[b] to a dynamically, which could be done with: Dynamic[a=Sin[b]] but again, this would only work if it appears visible within the FronEnd, if you put a ; after it, it will not appear in the output, so it will not do anything. I think this is more close to what you want: DynamicModule[{a,b = 0}, Column[{ Dynamic[a = Sin[b]], Dynamic[a + 1], Slider[Dynamic[b], {0, 2*Pi}] }] ] If you don't want the 'intermediate' result to be shown in the FrontEnd, you can wrap everything and suppress output: DynamicModule[{a,b = 0}, Column[{ Dynamic[ a = Sin[b]; a + 1 ], Slider[Dynamic[b], {0, 2*Pi}] }] ] Another very useful mechanism to assign a value to a whenever b changes is to use the second argument in Dynamic, like this: DynamicModule[{a,b = 0}, Column[{ Dynamic[a + 1], Slider[Dynamic[b, (b = #; a = Sin[b]; #) &], {0, 2*Pi}] }] ] hth, albert