Эквивалент цикла" 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 более эффективен при разработке как управляемое данными программирование, а не как полностью написанный код.