SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1592|回复: 2
打印 上一主题 下一主题

为什么不可以循环调用宏????急~急

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2010-6-1 11:23:10 | 只看该作者

为什么不可以循环调用宏????急~急

我的问题描述如下,请问该如何解决???
先谢谢啦

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;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2010-6-1 13:51:45 | 只看该作者

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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2010-6-1 20:17:25 | 只看该作者

Re: 为什么不可以循环调用宏????急~急

为什么可以呢?想一想,宏编译之后,相当于在数据步中直接运行过程(sort), 当然不可接受了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-2-4 05:06 , Processed in 0.100263 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表