Я борюсь с тем, как я могу создать вывод, когда использую цикл выполнения макроса в SAS. На обычном шаге данных я могу создать следующий набор данных с переменными i
и var
для «печати» в окне вывода, выполнив следующие действия:
data example;
do i=1 to 4;
var = 2+i;
output;
run;
Что создаст в окне вывода
Obs i var
1 1 3
2 2 4
3 3 5
4 4 6
Теперь моя проблема заключается в том, что я использую цикл выполнения макроса и, похоже, не могу сделать то же самое, что и в обычном шаге данных (т.е. не могу отобразить свой результат в окне вывода). Цель моего макроса — добавить «_new» в конец каждого имени переменной (ABCD) из списка, а затем мне нужно, чтобы это отображалось в окне вывода.
%let myvarlist=A B C D;
%macro create_new;
%let mlength=%countlength(&myvarlist);
%let suffix=new;
%do n=1 %to &mlength;
%let var_n=%qscan(&myvarlist,&n);
%let my_new_varlist=&var_n._&suffix;
%end;
%mend;
%create_new
Самое близкое, что я мог сделать, это поставить %put &my_new_varlist;
прямо перед оператором %end
, но это помещает его в окно журнала. Я попытался вставить цикл do в шаг данных, а затем использовать proc print, но это не сработало.
Макрос %countlength
— это макрос, который я использую для подсчета количества переменных в моем списке. Код для него:
%macro countlength(char);
%local num inputword;
%let num=1;
%let inputword=%qscan(&char,&num,%str( ));
%do %while(&inputword NE);
%let num=%eval(&num+1);
%let inputword=%qscan(&char,&num,%str( ));
%end;
%eval(&num-1);
%mend;
2 ответа
Я не думаю, что только макроязык можно использовать для записи в окно вывода, потому что это не его работа. Его работа (в основном) заключается в создании кода SAS. Однако код SAS может записывать в окно вывода. Возможно:
data _null_ ;
file print ;
put "&my_new_varlist" ;
run ;
Предлагаем вам взглянуть на служебный макрос Ричарда Девензиа %seplist. Это очень хороший подход к добавлению префиксов/суффиксов/разделителей в списки. http://www.devenezia.com/downloads/sas/macros /index.php?m=сеплист
Существуют глобальная таблица макросимволов и локальная таблица макросимволов, макропеременная &num, созданная в макропрограмме countlength, является локальной макропеременной, она будет удалена из локальной таблицы после завершения выполнения countlength, поэтому &num нельзя использовать для вызова макропрограммы ( создать новое). Ваш код может быть изменен как:
%macro countlength(char);
%let num=1;
%let inputword=%qscan(&char,&num,%str( ));
%do %while(&inputword NE);
%let num=%eval(&num+1);
%let inputword=%qscan(&char,&num,%str( ));
%end;
%global mlength;
%let mlength=%eval(&num-1);
%mend;
%let myvarlist=A B C D;
%macro create_new;
%countlength(&myvarlist)
%let suffix=new;
%do n=1 %to &mlength;
%let var_n=%qscan(&myvarlist,&n);
%let my_new_varlist=&var_n._&suffix;
%put &my_new_varlist;
%end;
%mend;
%create_new
Кроме того, countw — это функция SAS для подсчета количества слов. Вы можете использовать напрямую.
%macro create_new;
%let mlength=%sysfunc(countw(&myvarlist));
%let suffix=new;
%do n=1 %to &mlength;
%let var_n=%qscan(&myvarlist,&n);
%let my_new_varlist=&var_n._&suffix;
%put &my_new_varlist;
%end;
%mend;
%create_new
EDIT: Если я правильно понял ваш вопрос, возможно, это коды.
%let myvarlist=A B C D;
%macro create_new;
%local mlength sufix n;
%let mlength=%sysfunc(countw(&myvarlist));
%let suffix=new;
data want;
%do n=1 %to &mlength;
%let var_n=%qscan(&myvarlist,&n);
my_new_varlist="&var_n._&suffix";
output;
%end;
run;
%mend;
%create_new
%put &my_new_varlist;
- это не совсем то, что я ищу :)
Похожие вопросы
Новые вопросы
loops
Циклы - это тип структуры потока управления в программировании, в котором последовательность операторов может выполняться многократно, пока не будет выполнено какое-либо условие.