Эквивалент цикла" for in " в SAS 9.3
Я ищу некоторое время эквивалент на цикл (как в Python или в R) на языке макросов SAS 9.3. The сделать петли кажется, это решение, но не работает точно так, как я хочу. Я основал способ сделать это на шаге данных с помощью сделать петли но он не работает с языком макросов. Например, на шаге данных этот код работает :
DATA _NULL_;
DO i = 1,3,5,9;
PUT i;
END;
RUN;
и затем приглашение журнала, как ожидалось :
1
3
5
9
когда я пытаюсь сделать то же самое с %DO цикл в макросе, у меня есть ошибки.
%MACRO test();
%DO i = 1,2,4,9 ;
%PUT i = &i;
%END;
%MEND;
%test();
журнал промп эти сообщения:
ERROR: Expected %TO not found in %DO statement.
ERROR: A dummy macro will be compiled
Я довольно новичок в SAS и stackoverflow, поэтому надеюсь, что мой вопрос не слишком глуп. Это так просто сделать в Python и R, тогда он должен иметь простой способ сделать это в SAS.
Спасибо за помощь-J. Muller
2 ответов
ближе всего я когда-либо сталкивался с этим шаблоном на языке макросов SAS, это:
%MACRO test();
%let j=1;
%let vals=1 2 4 9;
%do %while(%scan(&vals,&j) ne );
%let i=%scan(&vals, &j);
%put &i;
%let j=%eval(&j+1);
%end;
%MEND;
%test();
(предупреждение: непроверено, так как у меня больше нет установки SAS, я могу проверить это.)
вы, конечно, можете обойти это таким образом:
options mindelimiter=,;
options minoperator;
%MACRO test();
%DO i = 1 %to 9 ;
%if &i in (1,2,4,9) %then %do;
%PUT i = &i;
%END;
%end;
%MEND;
%test();
однако, я думаю, вы обычно можете избежать такого вызова, выполнив свой макрос несколько раз, а не пытаться контролировать цикл внутри макроса. Например, представьте набор данных и макрос:
data have;
input x;
datalines;
1
2
4
9
;;;;
run;
%macro test(x);
%put &x;
%mend test;
Теперь вы хотите вызвать %test () один раз для каждого значения в этом списке. Хорошо, легко сделать.
proc sql;
select cats('%test(',x,')') into :testcall separated by ' ' from have;
quit;
&testcall;
это работает так же хорошо, как и ваш %в цикле, за исключением того, что он управляется данными, что означает, если вы хотите изменить вызовы вы просто изменить набор данных (или если ваши данные изменяются, вызов автоматически изменяется!). В целом, SAS более эффективен при разработке как управляемое данными программирование, а не как полностью написанный код.