# Stopping Evaluation of Manipulate after it goes through once

I do quite a bit of textual analysis with Mathematica, and am currently making some Manipulate objects to walk people through key terms in the database.

One issue I am running into with Manipulate however is that it continues to evaluate. For example, please consider the following code: (warning, this code does loop FWIW)

testInput = {{"the", 4415}, {"of", 1284}, {"and", 1608}, {"in",
1384}, {"to", 1353}, {"a", 1205}, {"coal", 815}, {"was",
753}, {"by", 459}, {"were", 449}, {"for", 382}, {"is",
362}, {"with", 324}, {"from", 322}, {"on", 317}, {"that",
311}, {"as", 302}, {"mines", 264}, {"s", 257}, {"mining",
257}, {"it", 253}, {"this", 244}, {"at", 244}, {"be",
225}, {"cape", 216}};

testInput2 = {{"the", 4415}, {"of", 1284}, {"and", 1608}, {"in",
1384}, {"to", 1353}, {"a", 1205}, {"coal", 815}, {"was",
753}, {"by", 459}, {"were", 449}, {"for", 382}, {"is",
362}, {"with", 324}, {"from", 322}, {"on", 317}, {"that",
311}, {"as", 302}, {"mines", 264}, {"s", 257}, {"mining",
257}, {"it", 253}, {"this", 244}, {"at", 244}, {"be",
225}, {"cape", 216}};

files = {testInput, testInput2};

Manipulate[
viewerCount1 = {};
Do[
input = access;
AppendTo[viewerCount1,
If[Length[Flatten[Cases[input, {word1, _}]]] == 0, 0,
Flatten[Cases[input, {word1, _}]][[2]]]];
, {access, files}];
Print[viewerCount1];
, {{word1, "the", "First Word:"}}]


It goes through, runs the Do loop which picks out the word frequencies of word1' in the sample text provided.

But then, it continues to loop. It goes back through and does it again. And again. And again. This is all without any change to the Manipulate input.

Is there a way to get to the end of the line Print[viewerCount1] and then stop until the input changes?

I have tried to figure out the behaviour by looking elsewhere, such as "Manipulate Evaluation Sequence" and in the documentation, but there seems to be a paucity of textual examples like this.

-
Would you please give a minimal example which shows that behaviour (and which ideally does not depend on having a certain directory or certain files)? –  celtschk May 16 '12 at 14:04
@celtschk Just trying to do so now. –  programming_historian May 16 '12 at 14:12
@celtschk Its updated now. Thank you and hope that this is clearer. –  programming_historian May 16 '12 at 14:21
I'm not completely sure what you want to achieve but does adding TrackedSymbols->{word1} to Manipulate help? –  sebhofer May 16 '12 at 14:29
I guess @celtschk beat me to the answer... and I have nothing to add to that. –  sebhofer May 16 '12 at 15:31

Here's a minimal example also showing that effect:

Manipulate[v=0; v++; Print[v], {i, 1}]


The problem is that Manipulate by default does not only track i, but also v. So when v is changed inside the Manipulate, it triggers a re-evaluation. Since the re-evaluation again modifies v, it triggers another re-evaluation, and so on.

There are two possible ways out. The first is:

Manipulate[Module[{v=0}, v++; Print[v]], {i, 1}]


That way, v is localized and not tracked by Manipulate. This is probably the best solution for your case, because after all you don't want any other code outside your Manipulate to interfere with that calculation.

The second is:

Manipulate[v=0; v++; Print[v], {i, 1}, TrackedSymbols :> {i}]


Here, you explicitly tell Manipulate to only track i, not v.

In your original code, it's the AppendTo which triggers the re-evaluation.

-
And to the readers: the RuleDelayed (:>) is quite necessary here. I forget this time after time. –  Sjoerd C. de Vries May 16 '12 at 17:14
@SjoerdC.deVries @celtschk Since RuleDelayed and this answer have both really gotten me over a hump in my work and have helped me understand the behaviour of my programs (which were sucking resources/occasionally crashing before), just a sincere thanks to both of you! –  programming_historian May 22 '12 at 13:08
@SjoerdC.deVries: What is the significance of RuleDelayed` here? –  raxacoricofallapatorius Dec 8 '12 at 15:54
@raxacoricofallapatorius It's to prevent that a value is being passed as an option value instead of the symbol what's needed here. Rule can work sometimes when the variable hasn't got a value yet but it is dangerous. –  Sjoerd C. de Vries Dec 9 '12 at 8:59