1

For the beginning of this discussion, see: A problem with Manipulate.

Now, the final use of the Initialization command doesn't protect the Global workspace. What I am discussing is not a single Manipulate object. Rather, imagine a notebook filled with static code and many Manipulate objects.

Now, here is an example. Suppose that the values of a and b before performing the Manipulate are assigned as follows:

a = 1; b = 5;

Then you run the Manipulate object.

Manipulate[
 Show[Plot[f[x], {x, a, b}, PlotStyle -> Thick, 
   AxesLabel -> {"x", "y"}], 
  Graphics[{Table[{Opacity[0.05], EdgeForm[Gray], 
      Rectangle[{a + i dx[n], 0}, {a + (i + 1) dx[n], 
        f[a + (i + 1) dx[n]]}]}, {i, 0, n - 1, 1}], 
    Text["N = " <> ToString[n] <> ",    R = " <> 
      ToString[rightSum[n]], {(a + b)/2, f[b]}]}]], {{n, 10}, 10, 50, 
  10, Appearance -> "Labeled"},
 Initialization :> (a = 0; b = 1; dx[n_] := (b - a)/n; f[x_] := x^2;
   rightSum[n_] := N@Sum[f[a + i dx[n]] dx[n], {i, 1, n}])]

Now, you are back in your workspace and you enter:

In[37]:= a

Out[37]= 0

In[38]:= b

Out[38]= 1

So, you can see that the Manipulate code affected objects in the workspace. So, question 1 is, what do you add to this code to prevent this from happening.

Here is a second example. Supposed that in the workspace you have defined:

dx = (b - a)/n

Then you try to run the Manipulate object.

Manipulate[
 Show[Plot[f[x], {x, a, b}, PlotStyle -> Thick, 
   AxesLabel -> {"x", "y"}], 
  Graphics[{Table[{Opacity[0.05], EdgeForm[Gray], 
      Rectangle[{a + i dx[n], 0}, {a + (i + 1) dx[n], 
        f[a + (i + 1) dx[n]]}]}, {i, 0, n - 1, 1}], 
    Text["N = " <> ToString[n] <> ",    R = " <> 
      ToString[rightSum[n]], {(a + b)/2, f[b]}]}]], {{n, 10}, 10, 50, 
  10, Appearance -> "Labeled"},
 Initialization :> (a = 0; b = 1; dx[n_] := (b - a)/n; f[x_] := x^2;
   rightSum[n_] := N@Sum[f[a + i dx[n]] dx[n], {i, 1, n}])]

Now it doesn't work, sending error messages such as:

Coordinate {(4/$CellContext`n)[10], (4/$CellContext`n)[10]^2} should be a pair of numbers, or a Scaled or Offset form. Not only that, but my Documentation notebook is also messed up.

Here is a third problem. Suppose I change the function and a and b in the initialization section to create a new Manipulate. That is, I first do this: set a=0, b=1, and f[x_]:=x^2.

Manipulate[
 Show[Plot[f[x], {x, a, b}, PlotStyle -> Thick, 
   AxesLabel -> {"x", "y"}], 
  Graphics[{Table[{Opacity[0.05], EdgeForm[Gray], 
      Rectangle[{a + i dx[n], 0}, {a + (i + 1) dx[n], 
        f[a + (i + 1) dx[n]]}]}, {i, 0, n - 1, 1}], 
    Text["N = " <> ToString[n] <> ",    R = " <> 
      ToString[rightSum[n]], {(a + b)/2, f[b]}]}]], {{n, 10}, 10, 50, 
  10, Appearance -> "Labeled"},
 Initialization :> (a = 0; b = 1; dx[n_] := (b - a)/n; f[x_] := x^2;
   rightSum[n_] := N@Sum[f[a + i dx[n]] dx[n], {i, 1, n}])]

Then set a=0, b=2, and f[x_]=x:

Manipulate[
 Show[Plot[f[x], {x, a, b}, PlotStyle -> Thick, 
   AxesLabel -> {"x", "y"}], 
  Graphics[{Table[{Opacity[0.05], EdgeForm[Gray], 
      Rectangle[{a + i dx[n], 0}, {a + (i + 1) dx[n], 
        f[a + (i + 1) dx[n]]}]}, {i, 0, n - 1, 1}], 
    Text["N = " <> ToString[n] <> ",    R = " <> 
      ToString[rightSum[n]], {(a + b)/2, f[b]}]}]], {{n, 10}, 10, 50, 
  10, Appearance -> "Labeled"},
 Initialization :> (a = 0; b = 2; dx[n_] := (b - a)/n; f[x_] := x;
   rightSum[n_] := N@Sum[f[a + i dx[n]] dx[n], {i, 1, n}])]

If you enter both in a notebook, then evaluate the notebook, you will see that both graphs and values of a and b are the ones defined in the second Manipulate chunk.

So I need to learn more. This is similar to what I posted at: Difficulty with Manipulate that has same variables as other code lines in a notebook, but I obviously need to learn more.

What should be added to the Manipulate code to prevent these things from happening?

David
  • 14,883
  • 4
  • 44
  • 117
  • You might repeat your experiment with a Manipulate hidden inside a Module. Perhaps that will give you the name isolation that you are looking for. – Bill May 25 '15 at 21:50

1 Answers1

3

I would localize the variables inside the DynamicModule created by the Manipulate by using the ControlType -> None (or simply None for short) specification. This use is discussed here:

Code:

Manipulate[
 Show[
  Plot[f[x], {x, a, b}, PlotStyle -> Thick, AxesLabel -> {"x", "y"}],
  Graphics[{
    Table[{Opacity[0.05], EdgeForm[Gray], 
      Rectangle[{a + i dx[n], 0}, {a + (i + 1) dx[n], 
        f[a + (i + 1) dx[n]]}]}, {i, 0, n - 1, 1}],
    Text["N = " <> ToString[n] <> ",    R = " <> 
      ToString[rightSum[n]], {(a + b)/2, f[b]}]
    }]],
 {{n, 10}, 10, 50, 10, Appearance -> "Labeled"},
 {{a, 0}, None}, {{b, 1}, None},
 {{dx, dx}, None}, {{f, f}, None},
 {{rightSum, rightSum}, None},
 Initialization :> (
   a = 0; b = 1;
   dx[n_] := (b - a)/n;
   f[x_] := x^2;
   rightSum[n_] := Total@Table[f[a + i dx[n]] dx[n], {i, 1., n}])]

Note that a declaration of the form {var, None} is equivalent to {{var, 0}, None}, so that the variable var would be initialized to 0. To prevent this, I initialized dx, f, and rightSum to their own symbols. If they were initialized to 0, then the definitions, dx[n_] := ... etc., would generate errors. (These initializations happen before the Initialization option is evaluated.)

Michael E2
  • 235,386
  • 17
  • 334
  • 747
  • Oh my goodness! http://mathematica.stackexchange.com/questions/72422/controltype-none-vs-module-inside-manipulate-i-e-making-everything-local/72477#72477 is a blast from the past. I don't remember reading this before. Might have had something to do with Christmas vacation. But it is awesome and I checked it for credit and I'm going to study it in detail tonight. Awesome help Michael. You are really helping me. – David May 26 '15 at 02:29
  • @David Very glad to help. Thanks. – Michael E2 May 26 '15 at 02:35
  • my #1 concern is the writing of notebooks to help students and instructors at our school be introduced to mathematica at a level that is easiest for beginners to understand. One of my favorite books is the Students's Introduction to Mathematica. It has been extremely helpful, but the authors wrap manipulate inside a module and they place modules inside manipulate. Do you have a text recommendation that trains its readers to use the manipulate command at a proper level? – David May 26 '15 at 05:54
  • @David I don't have a recommendation, and I would expect a book by Bruce Torrence, whom I've met, to be pretty good. Dynamic stuff is complicated and constructs that work in a narrow context don't work in a broader one. The notion of "scope" (of a symbol) becomes many times more complicated by Manipulate (or DynamicModule), and people new at programming find scope a difficult concept even at its simplest. In this context, what you show you're doing in your questions is somewhat sophisticated, probably an appropriate stretch for instructors but perhaps a little much for some students. – Michael E2 May 26 '15 at 12:23
  • @David You could tell your students & colleagues that any the Module outside a Manipulate should be a DynamicModule. That would probably work in most/all use-cases and is a fairly straightforward instruction. (Other than initialization, which needs some special care.) – Michael E2 May 26 '15 at 13:11