SAS有条件地执行宏

时间:2017-03-27 15:26:26

标签: sas sas-macro

我想根据数据集中的一些循环变量有条件地执行宏。

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;

这怎么可能? 如果我执行上面的示例代码,hello只输出一次,而alldat包含5个值,正如人们所期望的那样。我想在输出中输入5 hello

谢谢!

1 个答案:

答案 0 :(得分:1)

如果您希望数据步骤循环输出hello 5次,请使用PUT语句而不是%PUT语句。

通常,宏用于生成随后执行的SAS代码。这实际上取决于您的宏生成什么类型​​的代码。如果它只生成可以在数据步骤中使用的语句,那么在DO循环内部调用它一次,生成的语句将运行5次。因此,如果您的宏生成可以更新其名称传递给它的变量的数据步骤语句,那么您的代码可能如下所示。

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

否则,您可以使用CALL EXECUTE生成宏调用,以便它们可以在数据步骤停止后运行并生成代码。此数据步骤将从现有数组中读取值并将值传递给宏。因此,对于输入数据中的每个观察,它将为宏生成5次调用。生成的宏调用将在数据步骤停止后运行。

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;