BookmarkSubscribeRSS Feed
Kevin_Viel
Obsidian | Level 7

How can I avoid the Warnings that an apparent symbolic reference is not resolved when the macro parameter value contains a reference to another macro parameter:

 

 

12701         , label_at_risk                    = Number of Patients at risk
WARNING: Apparent symbolic reference TREAT_GROUP_VAR not resolved.
12702      
12703         , xaxis_labelattrs_weight          = bold
WARNING: Apparent symbolic reference TIMELIST_UNITS not resolved.
12704         , yaxis_labelattrs_weight          = bold
12705      
12706         , lifetest_quartiles_inset_label   = cat( strip( &treat_group_var. )
12707                                                 %str(,) " median Overall Survival [&timelist_units.] (95% CI) = "
WARNING: Apparent symbolic reference TREAT_GROUP_VAR not resolved.
12708                                                 )
12709      
12710         , phreg_inset_label                = cat( "HR (95% CI) ["
12711                                                 %str(,) strip( prxchange( "s/^&treat_group_var.//i"
12712                                                                   %str(,) 1
12713                                                                   %str(,) left( description )
12714                                                                   )
12715                                                        )
12716                                                 , "] = "
12717                                                 )

The value that I specified for the macro parameters LIFETEST_QUARTILES_INSET_LABEL and PHREG_INSET_LABEL use other macro parameters.  I could just provide the value of, say, TREAT_GROUP_VAR, but I was being lazy, I mean, expeditious.  Well, it seems better to just change the value once.  I note that when I use the macro with the default values for these variables, which use the same macro parameters as this example, I did not get the Warnings.

 

I was wondering if I could mask the ampersand in the value, but have it properly resolve in macro execution.  I failed this question previously, but it is really bugging me now.

 

Thank you,

 

Kevin

 

2 REPLIES 2
Quentin
Super User

Hi Kevin,

 

The challenge is that when you call a macro any macro variable references in the macro invocation are resolved before the macro is invoked.

 

So:

%macro try(x=,y=) ;
  %put &=x &=y ;
%mend try ;

%try(x=3,y=&x)

Might give the right result, but for bad reasons.  SAS tries to resolve &x during the macro call but it can't, so it throws the warning, and the local macro variable Y will have the value &x  (rather than the value 3).

 

One option is to use %nrstr() to hide the & sign in the macro variable reference in the invocation, but then you need to %unquote the value inside the macro to get it to resolve.  So something like this can work:

 

%macro try(x=,y=) ;
  %let y=%unquote(&y) ;
  %put &=x &=y ;
%mend try ;

%try(x=9,y=%nrstr(&x))

I don't love that approach.  But I've used it.

 

As you say, when you use the macro reference in a default value, you don't have to jump through these hoops, because the macro reference is not actually seen in the macro call.  So below works fine:

%macro try(x=,y=&x) ;
  %put _local_ ;
  %put &=x &=y ;
%mend try ;

%try(x=0)

As seen from the %put _local_, the local macro variable y will have the default value &x.  But when y is referenced in the macro, it will first resolve to &x, which will then resolve.  So it can work as a way to make y an indirect reference to the value of x.

 

HTH,

--Q.

 

BASUG is hosting free webinars Next up: Don Henderson presenting on using hash functions (not hash tables!) to segment data on June 12. Register now at the Boston Area SAS Users Group event page: https://www.basug.org/events.

sas-innovate-2024.png

Available on demand!

Missed SAS Innovate Las Vegas? Watch all the action for free! View the keynotes, general sessions and 22 breakouts on demand.

 

Register now!

How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

Find more tutorials on the SAS Users YouTube channel.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 2 replies
  • 703 views
  • 6 likes
  • 3 in conversation