sas - Sas 宏:对数组中的每个元素运行宏
问题描述
我正在尝试为数组中的每个元素调用另一个宏。这是对同一问题的更简单描述。我希望宏在另一行中打印每个 var,但事实并非如此。为什么?如何解决这个问题?
%macro test(varlist);
%local var i ;
%do i = 1 %to %sysfunc(countw(&varlist)) ;
%let var = %scan(&varlist,&i) ;
%put looped var is &var;
%end ;
%mend test;
%test(var1 var2 var3)
解决方案
SAS 宏不包含数组结构。但是,在 SAS 宏中,可以以类似数组的方式处理描述分隔项列表的文本序列。所描绘的项目可以表示可以进一步利用或作为源代码发出以进行进一步处理的其他事物。
发布的代码确实在您调用的变量名称的空格分隔列表中记录了每个项目一行。
SAS 日志
1 %macro test(varlist);
2 %local var i ;
3 %do i = 1 %to %sysfunc(countw(&varlist)) ;
4 %let var = %scan(&varlist,&i) ;
5 %put looped var is &var;
6
7 %end ;
8 %mend test;
9
10 %test(var1 var2 var3)
looped var is var1
looped var is var2
looped var is var3
对于代码,尤其是宏代码,在预期时没有登录信息的情况下,可能有其他编程语句不正确并改变预期状态。您可能有不平衡的引号导致宏源代码被视为另一个步骤的一部分。有时,当执行程序无法返回到正确的“就绪”状态时,重新启动 SAS 会话是最好的做法。