8
$\begingroup$

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.

$\endgroup$
6
  • 1
    $\begingroup$ 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)? $\endgroup$
    – celtschk
    Commented May 16, 2012 at 14:04
  • $\begingroup$ @celtschk Just trying to do so now. $\endgroup$ Commented May 16, 2012 at 14:12
  • $\begingroup$ @celtschk Its updated now. Thank you and hope that this is clearer. $\endgroup$ Commented May 16, 2012 at 14:21
  • 1
    $\begingroup$ I'm not completely sure what you want to achieve but does adding TrackedSymbols->{word1} to Manipulate help? $\endgroup$
    – sebhofer
    Commented May 16, 2012 at 14:29
  • 1
    $\begingroup$ I guess @celtschk beat me to the answer... and I have nothing to add to that. $\endgroup$
    – sebhofer
    Commented May 16, 2012 at 15:31

1 Answer 1

9
$\begingroup$

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.

$\endgroup$
4
  • 2
    $\begingroup$ And to the readers: the RuleDelayed (:>) is quite necessary here. I forget this time after time. $\endgroup$ Commented May 16, 2012 at 17:14
  • $\begingroup$ @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! $\endgroup$ Commented May 22, 2012 at 13:08
  • $\begingroup$ @SjoerdC.deVries: What is the significance of RuleDelayed here? $\endgroup$
    – orome
    Commented Dec 8, 2012 at 15:54
  • $\begingroup$ @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. $\endgroup$ Commented Dec 9, 2012 at 8:59

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.