# Continuation of a Problem with Manipulate

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:= a

Out= 0

In:= b

Out= 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/$CellContextn), (4/$CellContextn)^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?

• 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

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.)

• 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 2:29
• @David Very glad to help. Thanks. – Michael E2 May 26 '15 at 2: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 5: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