2014-11-04 53 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被认为是一个arugment而不是常数。 我该如何为此做一个简短而容易的工作?

+0

这里是一个常问的问题。您可以在数据步骤中轻松完成此操作。乔的答案在这里(http://stackoverflow.com/questions/25545892/dynamically-call-macro-from-sas-data-step?s=1|1.2332)可能是如何做到最好的总结。还有其他的选择,一个快速的谷歌搜索会出现很多的例子。 – DomPazz 2014-11-04 16:00:10

+0

我觉得它已经足够接近了。我想说的唯一不真正涵盖的就是添加常数,但这很容易在各种解决方案中完成(通常通过将数字作为数据集中的变量添加)。 – Joe 2014-11-04 20:34:00

回答

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; 

This works。

+0

非常感谢。有用!由于我只是宏观的初学者,所以当我阅读参考文献时,有太多的东西我不明白。 – 2014-11-05 02:07:34

0

使用call execute通常是可以的,但它可能有点费力地得到引用的权利,我发现它有时无法正确处理复杂的宏。我倾向于使用宏观方法,通过重写原始宏来接受循环开始和结束的参数,或者通过编写包装器宏(例如,

%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

它也适用。非常感谢。作为学习宏观的第一步,我真的需要直接的建议,如你所示。虽然有类似的问题和答案,但我甚至都不认识它们并将它们应用到我的案例中。 – 2014-11-05 02:18:33