楼主: 2oo8
16644 17

[问答] 关于宏变量使用%let赋值后,用%put输出结果的疑问 [推广有奖]

  • 0关注
  • 0粉丝

高中生

60%

还不是VIP/贵宾

-

威望
0
论坛币
281 个
通用积分
0.1288
学术水平
0 点
热心指数
5 点
信用等级
0 点
经验
1995 点
帖子
12
精华
0
在线时间
36 小时
注册时间
2012-5-8
最后登录
2022-5-2

楼主
2oo8 发表于 2014-10-14 16:16:50 |只看作者 |坛友微信交流群|倒序 |AI写论文
10论坛币
  1. %let a=cat;
  2. %macro animal;
  3. %let a=dog;
  4. %mend;
  5. %animal
  6. %put a is &a;
复制代码
输出为:
a is dog
  1. %let a=cat;
  2. %macro animal(a=name);
  3. %let a=dog;
  4. %mend;
  5. %animal(a=dog1);
  6. %put a is &a;
复制代码
输出为:
a is cat
  1. %let a=cat;
  2. %macro animal(name);
  3. %let a=dog;
  4. %mend;
  5. %animal(dog1);
  6. %put a is &a;
复制代码
输出为:
a is dog
  1. %let a=cat;
  2. %macro animal(b=name);
  3. %let a=&b;
  4. %mend;
  5. %animal(b=puppy);
  6. %put a is &a;
复制代码
输出为:
a is pubby
  1. %let a=cat;
  2. %macro animal(a=name);
  3. %let a=&a;
  4. %mend;
  5. %animal(a=puppy);
  6. %put a is &a;
复制代码
输出为:
a is cat
现在我已经完全晕了,求大神解惑。

update2:楼主已经自己想通了,思路在“藤椅”那楼(这是2楼还是3楼?)

update 1:
根据以上各种情况,归纳出来只要宏中没有相同名称paramater,就以后一个%let为准,paramater中有同名的,以第一个%let为准。就是不知道其中的道理是什么。。。。

关键词:输出结果 put let Animal update animal local
沙发
2oo8 发表于 2014-10-14 16:40:00 |只看作者 |坛友微信交流群
  1. %macro trans;
  2. %let type=Airplane;
  3. %location(Automobile)
  4. %put type is &type;
  5. %mend;
  6. %macro location(type1);
  7. data _null_;
  8. call symput('type', 'Train');
  9. %put location is &type;
  10. run;
  11. %mend;
  12. %trans
复制代码
  1. %macro trans;
  2. %let type=Airplane;
  3. %location(Automobile)
  4. %put type is &type;
  5. %mend;
  6. %macro location(type);
  7. data _null_;
  8. call symput('type', 'Train');
  9. %put location is &type;
  10. run;
  11. %mend;
  12. %trans
复制代码


同样还有以上两组输出结果,实在是太诡异了,求大神解答

使用道具

藤椅
2oo8 发表于 2014-10-14 19:18:58 |只看作者 |坛友微信交流群
经过一番纠结,貌似自己纠结出来了。。。

首先说明下%let的赋值过程
以:%let a = b; 为例
先在local variable table查找宏变量a是否存在。如果存在a,那么会更新a中的值为b;如果不存在,则去global variable table中查找是否存在a,如果存在则更新a。如果根本不存在宏变量a,那么将建立一个most local variable(就是说,如果%let语句出现在某个macro function内,那么这个变量仅能够在此macro function内使用。如果是单独的一句%let,那么就是global variable)

现在来看题
  1. %let a=cat;
  2. %macro animal;
  3. %let a=dog;
  4. %mend;
  5. %animal
  6. %put a is &a;
复制代码
首先单独的一句%let,建立了一个global macro variable 'a',赋值为'cat'。接着在macro function内又出现了一句%let,此时sas会先在此macro function范围内查找是否存在变量a,结果是不存在。那么sas继续在global macro variable中查找是否存在a,结果是存在,sas将global macro variable 'a'的值更新为dog。由于a是global variable,所以最后输出的结果:a is dog

  1. %let a=cat;
  2. %macro animal(a=name);
  3. %let a=dog;
  4. %mend;
  5. %animal(a=dog1);
  6. %put a is &a;
复制代码
这一题,不同的地方是,在macro function内建立了一个local macro variable 'a',那么%let a = dog这一语句只会更新该local macro variable 'a',而不会改变global variable 'a'的值。所以在最后输出global variable 'a'的时候结果依然是'cat'。用以下程序可以很好的显示local和global variable 'a'的值。

  1. %let a=cat;
  2. %macro animal(a=name);
  3. %let a=dog;
  4. %put local variable a is &a;
  5. %mend;
  6. %animal(a=dog1);
  7. %put global variable a is &a;
复制代码



用以上的思路同样可以解释其他几个例子的输出结果,我就不一一列举了

使用道具

板凳
兔耳朵在飞 发表于 2015-8-14 12:48:25 |只看作者 |坛友微信交流群
谢谢楼主,很有帮助!

使用道具

报纸
Crystal莹zyy 发表于 2015-12-25 10:45:00 |只看作者 |坛友微信交流群
我最近也在纠结这个问题 感谢楼楼解惑

使用道具

地板
freerunning_sky 在职认证  发表于 2015-12-25 18:21:12 |只看作者 |坛友微信交流群
弄清楚全局宏变量和局部宏变量的关系就好了

使用道具

7
yangqin4587 发表于 2016-1-10 09:44:33 |只看作者 |坛友微信交流群
非常感谢 ,也 清晰了不少

使用道具

8
zeldalyc 发表于 2016-6-22 09:57:36 |只看作者 |坛友微信交流群
谢谢楼主,对新手很有帮助

使用道具

9
吕小布韦 发表于 2016-6-22 17:56:35 |只看作者 |坛友微信交流群
用%put &a不好确定显示的宏变量, 建议macr里外都用 %put _user_, 这样你能搞清楚到底显示的是哪个宏变量的值. 比如

%let a=cat;
%macro animal(a=name);
%let a=dog;
%put _user_;
%mend;
%animal(a=dog1);

显示的是
ANIMAL A dog
GLOBAL A cat

一目了然

使用道具

10
ryoki805 学生认证  发表于 2016-9-8 05:35:39 |只看作者 |坛友微信交流群
楼主的解答非常有帮助

使用道具

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

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

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

GMT+8, 2024-4-20 01:48