2017-02-08 6 views
0

Итак, у меня есть этот макрос: stab_index(yearmonth,period).запустить макрос несколько раз с разными параметрами сразу

Давайте предположим, что у меня есть, чтобы запустить его в 5 раз (возможно, больше) с различными параметрами, как этот

%stab_index(201601,01/2016); 
%stab_index(201602,02/2016); 
%stab_index(201603,03/2016); 
%stab_index(201604,04/2016); 
%stab_index(201605,05/2016); 

для того, чтобы генерировать адекватный набор данных для запуска другого макроса: Stab_Ind_DYNAMICS.

Но я не хочу запускать 6 раз, чтобы получить результат, я бы хотел запустить все из них сразу, не заполняя параметры каждый раз.

Может кто-то указать мне в направлении того, как я это установлю?

Спасибо!

+0

Возможно, вы захотите больше объяснить, что делает% STAB_INDEX. Я мог бы сказать, что вы не хотите «делать это так». –

ответ

0

Вы можете добиться этого с помощью другого макроса, который будет проходить через ваш список параметров.

%let param1 = 201601 201602 201603 201604 201605; 
%let param2 = 01/2016 02/2016 03/2016 04/2016 05/2016; 
%macro loop(); 
    %do i=1 %to %sysfunc(countw(&param1,%str())); 
     %let thisparam1=%scan(&param1,&i,%str()); 
     %let thisparam2=%scan(&param2,&i,%str()); 
     %put &thisparam1 &thisparam2; 
     %stab_index(&thisparam1,&thisparam2); 
    %end; 
%mend loop; 
%loop; 

Сначала необходимо определить списки параметров (я назвал их param1 & Param2 здесь).

Затем вы можете перебирать от 1 до количества слов и извлекать i-й параметр из списка и использовать его в своем макросе stab_index.

Только в случае, если вы параметры содержит пробелы, вы можете использовать другой разделитель, чем пространства для списков и определить его с 2-го аргумента в функции COUNT нед (%sysfunc(countw(&param1,'-'))) и третий параметр в функции сканирования (%scan(&param1,&i,'-')).

+0

Если вы код '% sysfunc (countw (& param1), '')', он сообщает COUNTW использовать как пробел, так и одиночный знак кавычки в качестве разделителей. Поскольку кавычки не имеют значения на макроязыке, они являются частью значения. Если вы хотите указать, что только пробел должен быть разделителем, вы указываете его как '% sysfunc (countw (& param1),% str())' – Quentin

+0

@Quentin. Вы правы, это была опечатка. Я имел в виду '% sysfunc (countw (& param1, ''))', а не '% sysfunc (countw (& param1), '')'. Ваш комментарий также относится к просмотру%? –

+0

К сожалению, я скопировал вашу опечатку и не заметил ее, но да, она применима ко всему макроязыку. Поэтому '% sysfunc (countw (& param1, ''))' будет рассматривать одиночную кавычку как разделитель, и так будет '% scan (& param1, & i, '')'. В макроязыке цитата не означает «это текстовое значение», потому что все значения являются текстом. Если вы добавите знак кавычки, это часть значения. – Quentin

1

Это предполагает, что ваши значения параметров всегда существуют в ваших данных. Если вы можете получить набор данных, вплоть до каждой уникальной комбинации yearmonth и period (как мой unique набор данных выглядят ниже), то вам не нужно вводить что-либо, просто дайте данным сделать работу, которая может вместить изменяющиеся данные:

** create test data **; 
data have0; 
    year = 2016; 
    do i=1 to 12; 
     temp=i; 
     output; 
    end; 
run; 

data have; set have0; 
    temp1 = strip(put(year,best4.))||strip(put(temp,z2.)); 
    yearmonth=intnx('month', input(put(temp1,6.), yymmn6.), 1)-1; 
    period=yearmonth; 
    format yearmonth yymmn6. period mmyys7.; 
run; 

** get data down to every unique combination of yearmonth and period **; 
proc sort data = have out=unique(keep=yearmonth period) nodupkey; 
    by yearmonth period; 
run; 

** create a macro string dynamically using data **; 
data create_macro_string; set unique; 
    macro_str=%nrstr("%stab_index")||"("||strip(put(yearmonth,yymmn6.))||","||strip(put(period,mmyys7.))||");"; 
    keep yearmonth period macro_str; 
run; 

** put all your macros into a list **; 
proc sql noprint; 
    select macro_str 
    into: macro_list separated by " " 
    from create_macro_string; 
quit; 

** call your macros **; 
%put &macro_list.; 
+0

Возможно, вас заинтересует CALL EXECUTE. http://support.sas.com/documentation/cdl/en/mcrolref/69726/HTML/default/viewer.htm#n1q1527d51eivsn1ob5hnz0yd1hx.htm –

 Смежные вопросы

  • Нет связанных вопросов^_^