Вы не можете использовать тест во время выполнения, чтобы запретить SAS компилировать некоторые строки кода на одном шаге данных. Вместо этого вам нужно использовать макрос логику, чтобы не генерировать строки кода.
Похоже, вы хотите использовать набор данных для генерации серии переменных, которые подсчитывают, сколько раз выполнено условие. Я обнаружил, что отладку намного проще, если генерация кода такого типа выполняется путем записи кода в файл. После этого вы можете остановиться после генерации файла, посмотреть на сгенерированный код и убедиться, что ваш шаг генерации кода работает правильно.
Похоже, вы хотите, чтобы новый набор данных был сгенерирован независимо от того, существует файл со списком пар VARIABLE / CONDITION или нет. Так что просто запрограммируйте ту часть шага данных и только условно сгенерируйте ту часть, которая вычисляет новые переменные. Поскольку вы генерируете операторы сумм, нет необходимости в блоке IF _N_ = 1 устанавливать нулевые начальные значения. SAS автоматически установит их на ноль и сохранит их. (Предполагая, что в HAVE еще нет переменных с этими именами, в которых оператор sum также не будет работать правильно.)
filename code temp;
data _null_;
file code ;
%if %sysfunc(exist(&dsname)) %then %do;
set &dsname end=eof;
put ' ' variable '+ ( ' condition ');' ;
%end ;
run;
Таким образом, либо временный файл CODE пуст, либо имеет такой код:
VAR1 + ( dx='123' );
VAR2 + ( sex='M' );
Затем, чтобы создать набор данных, просто запустите этот шаг с %INCLUDE
, чтобы добавить условно сгенерированный код.
data want;
set have;
%include code /source2;
run;
Если вы используете старую версию SAS, вам нужно заключить этот оператор %IF
в макрос. Но новейшие выпуски SAS допускают этот тип простой конструкции% IF /% THEN /% DO /% END в открытом коде.