SAS中文论坛

标题: 为什么不可以循环调用宏????急~急 [打印本页]

作者: shiyiming    时间: 2010-6-1 11:23
标题: 为什么不可以循环调用宏????急~急
我的问题描述如下,请问该如何解决???
先谢谢啦

1、我先是定义了一个宏,如下,可以运行

%macro mbad(group,A,target,n);
proc sort data=&group out=Sgroup;
by group;
run;

data &A.&n.&target._bad(keep=group aren_num ali_num aprop);
  set Sgroup;
  by group;
      retain aren_num ali_1 ali_2 ali_3 num 0;
      if ae01&target.=&n or ae02&target.=&n or ae03&target.=&n then aren_num+1;
      if ae01&target.=&n then ali_1+1;
      if ae02&target.=&n then ali_2+1;
      if ae03&target.=&n then ali_3+1;
      ali_num=sum(ali_1,ali_2,ali_3);
      num+1;
    aprop=aren_num/num;
        if last.group then output;
run;

%mend;


2、然后分别调用宏,调用了很多次,每次是出一个表,如下,都可可以运行成功

%mbad(Agroup,A,deg,n=1)
%mbad(Agroup,A,deg,n=2)
%mbad(Agroup,A,deg,n=3)
%mbad(Bgroup,B,deg,n=1)
%mbad(Bgroup,B,deg,n=2)
%mbad(Bgroup,B,deg,n=3)


%mbad(Agroup,A,rela,n=1)
%mbad(Agroup,A,rela,n=2)
%mbad(Agroup,A,rela,n=3)
%mbad(Agroup,A,rela,n=4)
%mbad(Agroup,A,rela,n=5)
%mbad(Bgroup,B,rela,n=1)
%mbad(Bgroup,B,rela,n=2)
%mbad(Bgroup,B,rela,n=3)
%mbad(Bgroup,B,rela,n=4)
%mbad(Bgroup,B,rela,n=5)

%mbad(Agroup,A,drop,n=1)
%mbad(Bgroup,B,drop,n=1)

3、由于调用的次数太多,且有规律性,我打算使用一个循环实现上面的宏调用。
  但是出现的问题是,%mbad(groups,A,target,n);好像根本没有使用我在循环中定义的变量。
  报出错误如下:
  ERROR: 文件“WORK.GROUPS.DATA”不存在。

ERROR 117-185: 有 5 个未闭合的“DO”块。



data aaa;
  do  groups="Agroup","Bgroup";
     do A="A","B";
        do target="deg","rela","drop";
           do nums=3,5,1;
        do n=1 to nums;
                   %mbad(groups,A,target,n);
                               
        end;
            end;
       end;
     end;
  end;
run;
作者: shiyiming    时间: 2010-6-1 13:51
标题: Re: 为什么不可以循环调用宏????急~急
[code:34s2cnvy]%macro mbad(group,A,target,n);
        %put NOTE:*** %nrstr(%mbad)(&group,&a,&target,&n) executed! ***;
%mend;
data _null_;
        array groups{2} $ ("Agroup","Bgroup");
        array a{2} $ ("A","B");
        array target{3} $ ("deg","rela","drop");
        array nums{3} (3,5,1);
        do i=1 to dim(target);
                do j=1 to dim(groups);
                        do k=1 to nums(i);
                                call execute('%mbad('||groups(j)||','||a(j)||','||target(i)||','||put(k,best.)||');');
                        end;
                end;
        end;
run;[/code:34s2cnvy]
[code:34s2cnvy]%macro mbad(group,A,target,n);
        %put NOTE:*** %nrstr(%mbad)(&group,&a,&target,&n) executed! ***;
%mend;
%macro invoke(groups=,a=,target=,nums=);
        %let j=1;
        %let sub_target=%scan(&target,1,%str( ));
        %let sub_nums=%scan(&nums,1,%str( ));
        %do %until(&sub_target eq);
                %let i=1;
                %let sub_groups=%scan(&groups,1,%str( ));
                %let sub_a=%scan(&a,1,%str( ));
                %do %until(&sub_groups eq);
                        %do k=1 %to &sub_nums;
                                %mbad(&sub_groups,&sub_A,&sub_target,&k)
                        %end;
                        %let i=%eval(&i+1);
                        %let sub_groups=%scan(&groups,&i,%str( ));
                        %let sub_a=%scan(&a,&i,%str( ));
                %end;
                %let j=%eval(&j+1);
                %let sub_target=%scan(&target,&j,%str( ));
                %let sub_nums=%scan(&nums,&j,%str( ));
        %end;
%mend;
%invoke(groups=Agroup Bgroup,
                a=A B,
                target=deg rela drop,
                nums=3 5 1);[/code:34s2cnvy]
作者: shiyiming    时间: 2010-6-1 20:17
标题: Re: 为什么不可以循环调用宏????急~急
为什么可以呢?想一想,宏编译之后,相当于在数据步中直接运行过程(sort), 当然不可接受了。




欢迎光临 SAS中文论坛 (https://mysas.net/forum/) Powered by Discuz! X3.2