21

This works:

list // BarChart[#[[2]], ChartLabels -> DateString @@@ #[[1]], ChartStyle -> "Pastel"] &

This doesn't:

list // BarChart[#[[2]], ChartLabels -> 
    DateString[#, {"ShortDay", "/", "ShortMonth"}] & @@@ #[[1]], ChartStyle -> "Pastel"] &

The difference is that in the second version DateString needs to be an anonymous function. But the entire expression already is an anonymous function. Since this won't work, how can I do what I want to do? Is the best way perhaps to define DateString[#,..] somewhere else, or can I solve this with parentheses or something like that?

Sjoerd C. de Vries
  • 65,815
  • 14
  • 188
  • 323
C. E.
  • 70,533
  • 6
  • 140
  • 264

2 Answers2

24

You can always string several anonymous functions together, but you'll also have to pay attention to operator precedence. In this case, you had to enclose the anonymous function in parentheses. Replace the corresponding line in your second example with the following and it works.

ChartLabels -> (DateString[#, {"ShortDay", "/", "ShortMonth"}] & @@@ #[[1]])

You can read this documentation page for more info on operator precedences. In your specific case, Rule or -> has a higher precedence than Function or &.

rm -rf
  • 88,781
  • 21
  • 293
  • 472
23

You can always use Function to create anonymous functions:

Function[{a},a^2]

is equivalent to

#^2&

and can be used as such, but it is unambiguous.

It can be used as:

Function[{a},a^2][2]

(* ==> 4  *)
Sjoerd C. de Vries
  • 65,815
  • 14
  • 188
  • 323