Why is it that not the value of b gets printed in the following example but the symbolname? How can I force the printing of the actual dynamic value of the variable?
a = {1, 2, 3};
DynamicModule[{b},
Print[Dynamic[b]];
{Dynamic[a], Dynamic[b]}
,
Initialization :> (b = Length[a]; a = a + 2)
]
output:
b$107
Out[2]= {{3, 4, 5}, 3}
Edit (after reading your answers/comments):
Consider the more simple example, without Initialization
code (to get around WReach's example):
a = {1, 2, 3};
DynamicModule[{b = Length[a]},
Print[Dynamic[b]];
{Dynamic[a], Dynamic[b]}
]
output:
During evaluation of In[4]:= b$602
Out[5]= {{1, 2, 3}, 3}
Note, that this example does what I want to if I use Module
instead of DynamicModule
or leave out Dynamic
from the Print
line. My concerns are:
Why does this second example fail to print the value of b correctly? There is no Initialization, which (according to the help) contains "an expression to evaluate when the DynamicModule is first displayed". Also according to help: "When DynamicModule
is first evaluated, initial assignments for local variables are made first, and then any setting for the Initialization
option is evaluated."
The help should read: "Initialization: an expression to evaluate when the result of DynamicModule
is first displayed", meaning that a Print
statement onscreen does not constitute the "result" of the DynamicModule
. If this is correct, then (and only then) I understand why the Print
statement does not mean that the Dynamic
object appears correctly.
I believe this happens because the Dynamic
object b
has not been displayed at the time the Print
statement is called, and therefore the initialization has not been made. As I recall, Dynamic
functionality does not operate until it is actually, visibly displayed.
See Why won't this work? Dynamic in a Select for more information.
In response to your update, my theory is that the Dynamic
statement within Print
in never displayed by the FrontEnd, and therefore it is never actually initialized. That is, it remains a unique placeholder, waiting to be filled by the dynamic value of b
when it is finally displayed.
One may see from the example below that the assignment RHS evaluation takes place before the body Print
, at least by measure of the display order in the FrontEnd. Further, we see that Print
"goes inside" Dynamic
and takes the unique symbol name created by DynamicModule
, and prints that. We can use ToString
to cause Print
to display the entire expression as it is. Likewise, if we extract the symbol name from that string, and convert it to an actual symbol, before printing, we get the expected value that has indeed already been assigned.
alarm := (Print["Initialized!"]; 3)
DynamicModule[{b = alarm},
Print @ ToString @ Dynamic @ b;
Print @ Symbol @ StringTake[ToString@Dynamic@b, {9, -2}];
Print @ Dynamic @ b;
];
Output:
Initialized! Dynamic[b$701] 3 b$701
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With