2014-11-04 1 views
1

Я новичок макроса. Я изменил макропрограмму и работает. Но, я должен написать следующий макрос в сто раз следующим образом.Как я могу исправить макропрограмму итеративно с последовательными постоянными числами в sas?

%quint(dsn=cc1, var=MB, quintvar=MB5, num=111) ;  
%quint(dsn=cc1, var=MB, quintvar=MB5, num=112) ; 
%quint(dsn=cc1, var=MB, quintvar=MB5, num=113) ; 
- 
- 
%quint(dsn=cc1, var=MB, quintvar=MB5, num=400) ; 

Каждый раз, когда я делаю программу для этого задания, num признается в качестве вознаграждения вместо постоянных чисел. Как я могу сделать короткий и простой для этого?

+0

Это часто задаваемый вопрос. Вы можете легко сделать это на шаге данных. Ответ Джо здесь (http://stackoverflow.com/questions/25545892/dynamically-call-macro-from-sas-data-step?s=1|1.2332), вероятно, лучший обзор того, как это сделать. Существуют и другие варианты, и быстрый поиск в Google будет включать множество примеров. – DomPazz

+0

Я думаю, что он достаточно близко, чтобы закрыть. Я бы сказал, что единственное, что на самом деле не распространяется, это добавить постоянное число в, но это легко сделать в различных решениях (обычно путем добавления числа в качестве переменной в наборе данных). – Joe

ответ

0

Вы можете использовать инструкцию RETAIN и CALL EXECUTE.

%macro quint (dsn, var, quintvar, num); 
    %put &dsn; 
    %put &var; 
    %put &quintvar; 
    %put # 
%mend; 

data _null_; 
    retain numv 111; 
    do until (numv = 400); 
     call execute ('%quint(cc1, MB, MB5,'||numv||')'); 
     numv+1; 
    end; 
run; 

Это работает.

+0

Большое вам спасибо. Оно работает! Поскольку я всего лишь новичок в макросе, у меня так много вещей, которые я не понимаю, когда читаю ссылки. –

0

Использование вызова выполняется, как правило, нормально, но это может быть немного затруднительно получить право цитирования, и я обнаружил, что он иногда не может обработать сложные макросы правильно. Я предпочитаю использовать макро-подход, перезаписывая исходный макрос, чтобы принимать параметры для начала и конца цикла, или путем написания макроса обертки, например.

%macro quint (dsn, var, quintvar, num); 
    %put &dsn; 
    %put &var; 
    %put &quintvar; 
    %put # 
%mend; 

%macro run_quint(dsn, var, quintvar, num_from, num_to); 
    %local i; 
    %do i = &num_from %to &num_to; 
     %quint(dsn=&dsn, var=&var, quintvar=&quintvar, num=&i) 
    %end; 
%mend; 

%run_quint(dsn=cc1, var=MB, quintvar=MB5, num_from=111, num_to = 115); 
+0

Он также работает. Большое спасибо. Как первый шаг изучения макроса, мне действительно нужны прямые советы, как вы показываете. Хотя есть похожие вопросы и ответы, я даже не узнаю их и не применяю их к моему делу. –