SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

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

关于宏变量

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2003-10-31 14:43:40 | 只看该作者

关于宏变量

初学者;
请问用let生成宏变量语句和call sysput生成宏变量语句有什么区别呢;
还有引用宏变量
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2003-10-31 16:54:45 | 只看该作者
起码从data步中取值的时候,就只能用Symput了

我觉得是赋值和取值的不同
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2003-11-3 11:14:51 | 只看该作者
sasprog问的是一个好问题。这两种方法在宏的应用中非常常见。

bowl说的非常有道理:“赋值和取值的不同”

1/ %let语句是global语句,在除DATATLINES外的任何地方可以出现,而在SAS BASE 中call sysput语句只能在data步中。另外call sysput也可出现在SCL。

2/ %let只是单次赋值(Creates a macro variable and assigns it a value);而call sysput可以灵活得获取data中变量值生成(多个)宏变量,当然也可以单个赋值(Assigns (a) value/s produced in a DATA step to (a) macro variables)。
如下面可生成宏变量POS1, POS2, POS3:
data team2;
   input position : $12. player $12.;
   call symput('POS'||left(_n_), position);
   cards;
shortstp Ann
pitcher Tom
frstbase Bill
;
run;


3/ 两者对结尾处的blank的处理也有所不同:
data _null_;
   call symput('TEST', 'SAS   ');
run;

%PUT **&TEST**; *retain trailing blank;

data _null_;
   call symput('TEST_SYMPUT', "&TEST");
;
run;
%LET TEST_LET =&TEST;

%put **&TEST_SYMPUT**;
%put **&TEST_LET**;

结果
8  %put **&TEST_SYMPUT**;
**SAS   **
9  %put **&TEST_LET**;
**SAS**

4/ 两者产生的宏变量都是全局宏变量,这点和PROC SQL SELECT INTO不同。

5/ call symput是在DATA步完成后才赋值的,这点需要小心。

5/ 可能还有其它差别,请补充。

与call symput对应的引用宏变量的方法是call symget,类似。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-18 14:35 , Processed in 0.138972 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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