Макропеременная instrm
действительно является значением, содержащим список имен переменных, разделенных пробелами. Возможно, вам лучше абстрагироваться от конкретной роли использования переменной и перейти к более общему имени параметра vars
. Кроме того, вместо того, чтобы полагаться на макропеременную, определенную в глобальной или охватывающей области, передайте список во время вызова. Вы правы в том, что разделенный пробелами список может быть перебран в макросе с циклом %do
с верхним пределом, равным countw
числу «слов» в списке - ваш синтаксис немного отклонен.
Вам не нужно макроизображать все, и дополнительная макрофикация спортивной логики зашла далеко. Помните, что вызовы макросов генерируют (или генерируют) исходный код, который подается в систему отправки SAS. Процесс кодирования макрокодирования, когда более абстрактное или инструментальное средство иногда называют codegen.
Ваш исходный код может быть ошибочным, поскольку вы оцениваете (в одной строке) несколько специальных дочерних переменных и выполняете присвоение значений одним и тем же 2 переменным (talent_type
и type_name
) и, таким образом, можете перезаписать ранее назначенное значение. Иногда такие оценки и присвоения OUTPUT
для отдельных строк.
%macro my_skill_classifier(data=, out=, special_vars=, special_type=);
%local i var;
data &out;
set &data;
if sports in ("football","basketball") and age <=7 then type = 1;
else
if sports='swimming' then type=2;
* what happens to football/baskeball > 7yr ?;
if missing(special_kid) then do;
%do i = 1 %to sysfunc(countw(&special_vars));
%let var = %scan(&special_vars, &i);
* regular data step code with macro resolutions sprinkled in;
if &var ^=. and var._1 ^=. then do;
talent_type = &special_type;
type_name = &var._1;
* maybe you really mean type_name = "&var._1";
end;
%end; %* end loop over special_vars list;
end;
run;
%mend;
%my_skill_classifier(data=new, out=old, special_vars=piano violin, special_type=1)
Короче говоря, убедитесь, что ваша методология формирования и оценки данных является надежной, прежде чем начинать макрокодирование. Если вы спросите себя Должен ли я это макрос? , будьте осторожны и ответьте нет. Будьте дружелюбны по отношению к сопровождающим и будущему, не усложняя вещи.