楼主: dollarkfl
12241 12

[问答] 在SAS宏语言中用do循环时,为什么有时候加不加%产生的效果一样 [推广有奖]

  • 9关注
  • 0粉丝

大专生

8%

还不是VIP/贵宾

-

威望
0
论坛币
1016 个
通用积分
0.4500
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
586 点
帖子
39
精华
0
在线时间
34 小时
注册时间
2014-1-4
最后登录
2024-1-24

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

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

关于在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变量)

二维码

扫码加我 拉你入群

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

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

关键词:SAS宏 do循环 宏语言 output outpu 神马

沙发
dollarkfl 发表于 2014-3-21 10:06:30 |只看作者 |坛友微信交流群
救人于迷惑之中,胜造七级浮屠!!!

使用道具

藤椅
harlon1976 发表于 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
已有 1 人评分论坛币 收起 理由
admin_kefu + 100 热心帮助其他会员

总评分: 论坛币 + 100   查看全部评分

使用道具

报纸
dollarkfl 发表于 2014-3-21 12:48:30 |只看作者 |坛友微信交流群
harlon1976 发表于 2014-3-21 10:37
我个人理解是,当使用%时,i为宏变量,不会保存在数据集中,而不加%时就是普通变量。
谢谢,你回答了为什么没有i变量的问题,再帮我想想为什么do%和do有时候没什么区别?

使用道具

地板
dollarkfl 发表于 2014-3-21 12:51:56 |只看作者 |坛友微信交流群
浇汁薄荷 发表于 2014-3-21 10:56
我有个想法 不知对不对。  因为macro语句在实现的过程中,比普通的sas语句的编译和执行两个步骤要多一个步骤 ...
谢谢,我似乎理解你的意思

使用道具

7
dollarkfl 发表于 2014-3-21 12:55:42 |只看作者 |坛友微信交流群
浇汁薄荷 发表于 2014-3-21 10:56
我有个想法 不知对不对。  因为macro语句在实现的过程中,比普通的sas语句的编译和执行两个步骤要多一个步骤 ...
再请教一下:option mprint是怎么用的,顺便给个简单的例子,谢谢先

使用道具

8
浇汁薄荷 发表于 2014-3-22 03:12:13 |只看作者 |坛友微信交流群
dollarkfl 发表于 2014-3-21 12:55
再请教一下:option mprint是怎么用的,顺便给个简单的例子,谢谢先
很简单 就是在编码的最开始  加一行:
option mprint;
即可。

mprint意思是在log中显示根据macro指令所产生的普通sas语句;如果不想要的话,就是nomprint,默认是不要的
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
四叶草 + 1 + 1 + 1 精彩帖子

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

使用道具

9
dollarkfl 发表于 2014-3-22 09:27:16 |只看作者 |坛友微信交流群
浇汁薄荷 发表于 2014-3-22 03:12
很简单 就是在编码的最开始  加一行:
option mprint;
即可。
好,又学了一个,谢过

使用道具

10
dollarkfl 发表于 2014-3-25 00:01:37 |只看作者 |坛友微信交流群
高手farmman60,我知道你牛!麻烦你再看看这个,帮我顺便也指点一下吧!!!

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-28 14:20