Here is a code sample that creates a control object which calculates the expressions inside Maniplate
again and again and never stop (it's proved by the code in the note):
Sample 1:
Manipulate[date = Table[0, {num}];
For[i = 1, i <= num, i++, date[[i]] = Sin[i]];(*Print@i;*)
ListPlot[{date}], {{num, 2}, 1, 20, 1}]
While
has the same problem:
Sample 2:
Manipulate[date = Table[0, {num}]; i = 1;
While[i <= num, date[[i]] = Sin[i]; i++];
ListPlot[{date}], {{num, 2}, 1, 20, 1}]
I know if I choose Do
, the problem will no longer exist:
Sample 3:
Manipulate[date = Table[0, {num}];
Do[date[[i]] = Sin[i], {i, 1, num}];
ListPlot[{date}], {{num, 2}, 1, 20, 1}]
Still, I know I can solve the problem if I throw the expression into Module
if what I'm using is For
:
Sample 4:
Manipulate[Module[{i}, date = Table[0, {num}];
For[i = 1, i <= num, i++, date[[i]] = Sin[i]];
ListPlot[{date}]], {{num, 2}, 1, 20, 1}]
And…yeah, it doesn't work for the code above with While
…:
Sample 5:
Manipulate[Module[{j}, date = Table[0, {num}]; j = 1;
While[j <= num, date[[j]] = Sin[j]; j++];
ListPlot[{date}]], {{num, 2}, 1, 20, 1}]
(*This still creates a problematic control object*)
How to solve the problem with While
? what actually happens inside Manipulate
? what's the exact reason for the endless loop?
OK, the problem with sample 5 turns out to be a collaboration of Sample 4 and Sample 5, before I run sample 5, a control object has been already created by Sample 4 (let's call it Object 4 below, and so we have Object 5 for Sample 5).I think the process should be like this: when date = Table[0, {num}];
in Sample 5 is executed, it's tracked by Object 4, and then For[i = 1, i <= num, i++, date[[i]] = Sin[i]];
in Sample 4 is executed, so it is tracked by Object 5…so this story tells us how important a good programing habit is…
TrackedSymbols:>
in your link works! But I still wonder why the solution withModule
doesn't work forWhile
… $\endgroup$While
? For me it does:Manipulate[Module[{i = 1}, date = Table[0, {num}]; While[i <= num, date[[i]] = Sin[i]; i++]; ListPlot[{date}]], {{num, 2}, 1, 20, 1}]
won't result in an endless loop... $\endgroup$i=1
is set in the expressions:Manipulate[Module[{j}, date = Table[0, {num}]; j = 1; While[j <= num, date[[j]] = Sin[j]; j++]; ListPlot[{date}]], {{num, 2}, 1, 20, 1}]
$\endgroup$Manipulate
shown at the same time? $\endgroup$