17
$\begingroup$

Bug introduced in 8.0 or earlier and persisting through 11.0.1 or later


f[x_?NumericQ]:= (Do[Break[],{i,1,2}];x)
Plot[x,{x,0,1},ColorFunction->(ColorData["Rainbow"][f[#]]&)]

Break::nofwd: No enclosing For, While, or Do found for Break[].

What's going on here? I've tried setting HoldFirst attribute on f and I've also tried using Unevaluated which gives surprising results:

(* Works fine, gives plot colored as expected *)
Plot[x, {x, 0, 1}, 
 ColorFunction -> (Unevaluated[ColorData["Rainbow"][f[#1]]] &)]

(* Gives a black and white plot with error:
   "Unevaluated is not a Graphics primitive or directive" *)
ListContourPlot[IdentityMatrix[3],
  ColorFunction->(Unevaluated[ColorData["Rainbow"][f[#1]]]&)]

Edit This on the other hand works:

Plot[x,{x,0,1},ColorFunction->Function[c,ColorData["Rainbow"][f[c]]]]

Which only difference is that it uses Function[c,ColorData["Rainbow"][f[c]]]] instead of Function[ColorData["Rainbow"][f[Slot[1]]]]]

$\endgroup$
  • $\begingroup$ @NasserM.Abbasi if you don't like getting into the internals I think you chose the wrong question. I think this behaviour is quiiite weird $\endgroup$ – Rojo Dec 17 '12 at 20:34
  • $\begingroup$ I have no idea what's going on. It seems like Return and Break just don't work properly when running a ColorFunction. The Unevaluated might fix it because the ColorFunction doesn't actually evaluate the Break statement while inside the function $\endgroup$ – Rojo Dec 17 '12 at 20:43
  • 1
    $\begingroup$ Perhaps, ColorFunction does some checking on the structure of the option (see that it can receive a string, a number, a function, and treat those cases differently). And, for some reason, when it's a function, Break and Return die. However, not when it's a function in the form Function[Null, ...]. Nonsense $\endgroup$ – Rojo Dec 17 '12 at 20:46
  • $\begingroup$ Another interesting observation is that Plot[x, {x, 0, 1}, ColorFunction -> Composition[ColorData["Rainbow"], f]] does not give an error, but it does not colour the plot either. The simpler Plot[x, {x, 0, 1}, ColorFunction -> Composition[ColorData["Rainbow"], # &]] doesn't work either. However, if I wrap it like this, Composition[ColorData["Rainbow"], # &], then use ColorFunction -> z, it does work. $\endgroup$ – Szabolcs Dec 17 '12 at 20:52
  • 4
    $\begingroup$ If I am not mistaken, this behavior is a consequence of a bad interaction of Break with AbortProtect, which in turn is probably used in some Plot code. It's an area that is receiving some attention in recent development work. I'm not sure what is the prognosis though. $\endgroup$ – Daniel Lichtblau Oct 16 '16 at 15:54

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.