全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
13040 12
2014-03-21

请哪位高手指点一下本菜鸟的迷津??

关于在SAS宏语言中do循环时,为什么有时候加不加%号产生的效果一样???

宏中使用do和%do的原理是神马?

这个是普通data步实现的累加效果语句:

data a ;

             x=0;

             do i = 1 to 5;

               x=x+2;

               output;

         end;

            run;

(运行结果有x变量和i变量)

下面是用宏语句产生累加效果的例子,第一个宏里面do循环没有用%号:

%macro pp (n);   

        data a ;

             x=0;

             do i = 1 to &n;

               x=x+2;

               output;

         end;

            run;

%mend pp;

%pp(5);

(运行结果有x变量和i变量)

下面同样是这个例子,只不过加上了%号:

%macro pp (n);

        data a ;

             x=0;

             %do i = 1 %to &n;

               x=x+2;

               output;

         %end;

            run;

%mend pp;

%pp(5);

(运行结果只有x变量没有i变量)

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2014-3-21 10:06:30
救人于迷惑之中,胜造七级浮屠!!!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-3-21 10:37:53
我个人理解是,当使用%时,i为宏变量,不会保存在数据集中,而不加%时就是普通变量。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-3-21 10:56:49
我有个想法 不知对不对。  因为macro语句在实现的过程中,比普通的sas语句的编译和执行两个步骤要多一个步骤,在这两步之前,多了一个根据macro语句生成sas语句的过程,所以我猜定是在这个过程中,这个被赋予%前缀的指令设计的变量i,在data statements中,只起作用但不产生变量。我们可以通过option mprint来查看log中究竟sas语句是怎样产生的。我复制过来,很容易能看出过程中的不同:

macro pp (n);
111          data a ;
112               x=0;
113               do i = 1 to &n;
114                 x=x+2;
115                 output;
116           end;
117              run;
118  %mend pp;
119  %pp(5);
MPRINT(PP):   data a ;
MPRINT(PP):   x=0;
MPRINT(PP):   do i = 1 to 5;
MPRINT(PP):   x=x+2;
MPRINT(PP):   output;
MPRINT(PP):   end;
MPRINT(PP):   run;

NOTE: The data set WORK.A has 5 observations and 2 variables.
NOTE: DATA statement used (Total process time):
      real time           0.01 seconds
      cpu time            0.01 seconds


120  proc print;run;

NOTE: There were 5 observations read from the data set WORK.A.
NOTE: PROCEDURE PRINT used (Total process time):
      real time           0.12 seconds
      cpu time            0.01 seconds


121
122  %macro pp (n);
123          data a ;
124               x=0;
125               %do i = 1 %to &n;
126                 x=x+2;
127                 output;
128           %end;
129              run;
130  %mend pp;
131  %pp(5);
MPRINT(PP):   data a ;
MPRINT(PP):   x=0;
MPRINT(PP):   x=x+2;
MPRINT(PP):   output;
MPRINT(PP):   x=x+2;
MPRINT(PP):   output;
MPRINT(PP):   x=x+2;
MPRINT(PP):   output;
MPRINT(PP):   x=x+2;
MPRINT(PP):   output;
MPRINT(PP):   x=x+2;
MPRINT(PP):   output;
MPRINT(PP):   run;

NOTE: The data set WORK.A has 5 observations and 1 variables.
NOTE: DATA statement used (Total process time):
      real time           0.01 seconds
      cpu time            0.01 seconds


132  proc print;run;

NOTE: There were 5 observations read from the data set WORK.A.
NOTE: PROCEDURE PRINT used (Total process time):
      real time           0.07 seconds
      cpu time            0.00 seconds
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-3-21 12:48:30
harlon1976 发表于 2014-3-21 10:37
我个人理解是,当使用%时,i为宏变量,不会保存在数据集中,而不加%时就是普通变量。
谢谢,你回答了为什么没有i变量的问题,再帮我想想为什么do%和do有时候没什么区别?
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-3-21 12:51:56
浇汁薄荷 发表于 2014-3-21 10:56
我有个想法 不知对不对。  因为macro语句在实现的过程中,比普通的sas语句的编译和执行两个步骤要多一个步骤 ...
谢谢,我似乎理解你的意思
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群