Hi, After further investigations, here are my reasoning. Do you agree? Part 1 - without style(calldef) Example 1: using 'style' in the second argument of compute age block. proc report data=sashelp.class;
columns name sex age height weight ;
define name--weight / display;
compute sex;
if sex='M' then call define ('name' ,'style','style=[foreground=lightblue]');
endcomp;
compute age;
if age=12 then call define ('name' ,'style' ,'style=[foreground=red]');
endcomp;
run; To start with foreground=lightblue when gender=M. Then, when gender='M' and age=12 then the foreground is changed to red ( John is now in red ) when gender ne 'M' and age=12 then the foreground which was not yet defined is set to red . Example 2: using 'style/merge' in the second argument of the compute age block. proc report data=sashelp.class;
columns name sex age height weight ;
define name--weight / display;
compute sex;
if sex='M' then call define ('name' ,'style','style=[foreground=lightblue]');
endcomp;
compute age;
if age=12 then call define ('name' ,'style/merge' ,'style=[foreground=red]');
endcomp;
run; To start with foreground=lightblue when gender=M . Then, when gender='M' and age=12 then foreground remains lightblue ( John is still in lightblue ) when gender ne 'M' and age=12 then the foreground which was not yet defined is set to red . From these extra two examples, we understand that - rule 1: for a given cell, the value of a given option is replaced when 'style' (or 'style/replace' ) is used - rule 2: for a given cell, the value of the already defined option is not changed when 'style/merge' is used These conclusions don't apply to style(calldef) . Example 3: using a mix of background= and foreground= as well as 'style' What we didn't see in example 1, was that 'style' does not just reset the given option, but the whole cell. proc report data=sashelp.class;
columns name sex age height weight ;
define name--weight / display;
compute sex;
if sex='M' then call define ('name' ,'style','style=[background=lightblue]');
endcomp;
compute age;
if age=12 then call define ('name' ,'style' ,'style=[foreground=red]');
endcomp;
run; In this example we see that John who had a light blue background to start with has now no background and a red foreground color. Example 4: using a mix of background= and foreground= as well as 'style/merge' proc report data=sashelp.class;
columns name sex age height weight ;
define name--weight / display;
compute sex;
if sex='M' then call define ('name' ,'style','style=[background=lightblue]');
endcomp;
compute age;
if age=12 then call define ('name' ,'style/merge' ,'style=[foreground=red]');
endcomp;
run; When using 'style/merge' , only options which were not set for a given value are added. For this reason John keeps his lightblue background and get now a red foreground . From these extra two examples, we understand that - rule 1(updated): for a given cell, the value of all the options is replaced when 'style' (or 'style/replace' ) is used - rule 2 (updated): for a given cell, the value of the already defined options is not changed when 'style/merge' is used Those conclusions don't apply to style(calldef) Part 2 - with style(calldef) Example 5: using style(calldef) and 'style' proc report data=sashelp.class style(calldef)=[foreground=white];
columns name sex age height weight ;
define name--weight / display;
compute sex;
if sex='M' then call define ('name' ,'style','style=[background=lightblue]');
endcomp;
run; style(calldef) only applies to values defined by call define routines. For this reason, Alice is written in black and not in white . Even if 'style' is used, the white foreground is kept (not reset to black ). Example 6: using style(calldef) proc report data=sashelp.class style(calldef)=[foreground=white]; columns name sex age height weight ; define name--weight / display; compute sex; *if sex='M' then call define ('name' ,'style','style=[foreground=lightblue]'); if sex='M' then call define ('name' ,'style/merge','style=[foreground=lightblue]'); endcomp; run; Here foreground is used in both style(calldef) and call define routine. The value given in call define has priority, even if 'style/merge' is used. That's the tricky part! Example 7: the original example in this post series proc report data=sashelp.class style(calldef)=[foreground=white];
columns name sex age height weight ;
define name--weight / display;
compute sex;
if sex='M' then call define ('name' ,'style','style=[background=lightblue]');
endcomp;
compute age;
if age=12 then call define ('name' ,'style/merge' ,'style=[foreground=red]');
endcomp;
run; Example 5 explains us why we have white foreground on lightblue background . A background and a foreground is already defined when gender='M' So, given that 'style/merge' is used in the compute age block, only females where age=12 get a red foreground . Note: Ballardw comment on the impact of the variables order in the column statement is an additional extra point to keep in mind. Here my compute blocks follow the same order as the one given in the column statement.
... View more