我想根据数据集中的一些循环变量有条件地执行宏。
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
。
谢谢!
答案 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;