# Using Animate[] statically

How can I have Animate[] create an animation only with the current instances of assigned variables, and then not update dynamically when they are changed later? For instance, if my code were

f[x_]:=x^2
Animate[Plot[f[a - x], {x, -1, 1}], {a, 0, 2}]
f[x_]:=x^3


it is going to overwrite the animation based on x^2 with the animation based on x^3. Is there an easy way to stop it from doing that?

## 1 Answer

You need to make Animate independent of f. How do you do that?

## Quick and dirty

A non-robust way, which works in this case, would be:

Module[{ff, xx},
ff = f[xx];
Animate[Plot[ff /. xx -> a - x, {x, -1, 1}], {a, 0, 2}]
]


This is unaffected by future redefinitions of f, and works in this this case. Note, however, that this relies upon f[xx] evaluating to something that is both (1) independent of future redefinitions* and (2) the same, upon replacement, as supplying f[a-x] directly. In particular, this would fail if f were initially defined as follows:

ClearAll[f]
(* f[xx] won't evaluate until xx is replaced with a real number *)
f[x_] /; x > 1 := x^2
f[x_] /; x < 1 := x


or

ClearAll[f]
(* f[xx] will evaluate differently than f[aRealNumber] *)
f[x_Real] := x^2
f[x_] := x


*Even here you could later do something silly like Unprotect[Power]; Power[x_,y__]:=x to mess things up, though I think it's reasonable to assume you're not worried about that.

## More robust

Module[{ff},
DownValues[ff] = (DownValues[f] /. f -> ff);
Animate[Plot[ff[a - x], {x, -1, 1}], {a, 0, 2}]
]


Here you've effectively copied the definition of f into ff.

• Use DynamicModule and it will even survive across sessions. – Kuba Nov 10 '17 at 21:43