Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.
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]]]]]

share|improve this question
    
@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 –  Rojo Dec 17 '12 at 20:34
    
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 –  Rojo Dec 17 '12 at 20:43
1  
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 –  Rojo Dec 17 '12 at 20:46
    
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. –  Szabolcs Dec 17 '12 at 20:52
    
@NasserM.Abbasi Yes, but also After a Break the value Null is returned from the enclosing control structure. and Do[Break[],{1}]===Null is True :) –  ssch Dec 17 '12 at 21:03
show 3 more comments

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Browse other questions tagged or ask your own question.