r0f1
r0f1

Reputation: 3106

SAS execute macro conditionally

I want to execute a macro conditionally, based on some loop variable in the dataset.

data alldat;
    do i=1 to 5;

        * here, a macro should be called ;
        * that is accessing some array variable of the dataset ;
        * e.g. %my_macro(my_array(i));

        %put hello; 
        output;
    end;
run;

proc print; run;

How is this possible? If I execute this example code above, hello is only output once, while alldat contains 5 values, as one would expect. I want 5 hellos in my output.

Thank you!

Upvotes: 0

Views: 895

Answers (1)

Tom
Tom

Reputation: 51621

If you want your data step loop to output hello 5 times then use a PUT statement instead of a %PUT statement.

In general macros are used to generate SAS code that is then executed. It really depends on what type of code your macro generates. If it only generates statements than can be used inside of a data step then call it once inside of your DO loop and the generated statements will run 5 times. So if your macro generates data step statements that could update the variable whose name is passed to it then your code might look like this.

data alldata;
  array my_array var1-var5 ;
  do i=1 to dim(my_array);
    %my_macro(my_array(i)); 
    put 'hello';
    output;
  end;
run;

Otherwise you could use CALL EXECUTE to generate the macro calls so that they can then run and generate their code after the data step stops. This data step will read values from an existing array and pass the values to the macro. So it will generate 5 calls to the macro for every observation in the input data. The generated macro calls will run after the data step stops.

data _null_;
  set mydata;
  array my_array var1-var5 ;
  do i=1 to dim(my_array);
    call execute(cats('%nrstr(%my_macro)(',my_array(i),');'));
    call execute('%nrstr(%put hello;)'); 
  end;
run;

Upvotes: 1

Related Questions