#sas #include #sas-macro
#САС #включать #sas-макрос
Вопрос:
Я использую макрос в нескольких программах SAS, поэтому я определил его в отдельном файле /myFolder/myMacro.sas
.
При работе в пакетном режиме я хочу использовать его таким образом: %include '/myFolder/myMacro.sas;'
При тестировании изменений в коде в Руководстве по предприятию я хочу отредактировать и запустить /myFolder/myMacro.sas
, затем отредактировать и запустить программы , которые его используют. Как я могу условно включить определения макросов?
%if amp;server = BATCH_SERVER %then %include '/myFolder/myMacro.sas;'
не работает: файл все равно включен, и %if
оператор применяется к комментарию в верхней части файла и приводит к
ERROR: Expected %DO not found. ERROR: Skipping to next %END statement.
Комментарии:
1. Таким образом, вы хотите, чтобы %include запускался только при работе в пакетном режиме?
Ответ №1:
Просто используйте %then %do
%let mode=BATCH; filename mac1 temp; filename mac2 temp; data _null_; file mac1; put '%macro mac1;%put mac1;%mend;%mac1;'; data _null_; file mac2; put '%macro mac2;%put mac2;%mend;%mac2'; run; %if amp;mode=BATCH %then %do; %inc mac2; %end; %else %do; %inc mac1; %end;
Комментарии:
1. Верно, Аллан, это и есть решение, но твой ответ так сильно отклонился от вопроса, что я не могу принять его как ответ на вопрос.
Ответ №2:
Как я и подозревал, ошибка возникает из-за того, что включаемый файл начинается с комментариев, что-то вроде:
* MyMacro is written to do this and that *; * ************************************** *; %macro MyMacro; proc this; proc that; run; %mend;
Таким образом, после включения файла это становится
%if amp;server = BATCH_SERVER %then * MyMacro is written to do this and that *; * ************************************** *; %macro MyMacro; proc this; proc that; run; %mend;
что недопустимо.
При работе внутри макроса: добавьте %do;
и %end;
Как предположил Аллан, достаточно поставить %inlcude
между %do;
и %end;
%if amp;server = BATCH_SERVER %then %do; %include '/myFolder/myMacro.sas;' %end;
Таким образом, после включения файла это становится
%if amp;server = BATCH_SERVER %then %do; * MyMacro is written to do this and that *; * ************************************** *; %macro MyMacro; proc this; proc that; run; %mend; %end;
что работает.
При работе в открытом коде: используйте call execute
data _null_; if "amp;mode"="BATCH" then call execute ("%include /myFolder/myMacro.sas;"); run; %DoIt;