SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 2501|回复: 3
打印 上一主题 下一主题

宏变量计算与逻辑判断

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2012-6-7 22:47:27 | 只看该作者

宏变量计算与逻辑判断

在如下的程序中,逻辑判断的条件并未满足,但是宏变量
的却参与了计算。如何以逻辑判断限制宏计算呢?
也就是,当条件满足时,才参与计算,条件不满足,就不计算。
请高手指点,非常感谢!

[code:gk1np5zz]

%let a=3;

%macro try;

proc iml;

  b=6;

  if b>9 then
  do;
     b=b+5;
     %let a=%eval(&a+10);
  end;

  print b &a;

quit;

%mend;
%try;


[/code:gk1np5zz]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2012-6-8 08:44:09 | 只看该作者

Re: 宏变量计算与逻辑判断

呵呵,简单:因为两个编译器的执行的先后顺序不一样.你一定要用这种口味去实现,那么修改如下:
[code:35i1dooa]
%let a=3;

%macro try;

proc iml;

  b=6;

  if b>9 then
  do;
     b=b+5;
     call symput('a',"%eval(&a+10)");
  end;

  print b (resolve('&a'));

quit;

%mend;
%try;
[/code:35i1dooa]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2012-6-16 10:26:19 | 只看该作者

Re: 宏变量计算与逻辑判断

%let的执行在任何sas language之间,后一个宏定义中的%let 改变了解a的值,而不管其他的SAS语句执行与否.
call symput根据条件定义宏变量的值.在引用a时,首先从local symbol table中取值.前面一个let产生的是global,后一个因为条件不合适,因而并不会产生宏变量
&a的值就会从gobal中取,为3.
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2012-7-13 10:42:59 | 只看该作者

Re: 宏变量计算与逻辑判断

mark!!!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-4 01:28 , Processed in 0.073778 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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