SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 5054|回复: 12
打印 上一主题 下一主题

求助:SAS 宏函数的返回值

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2008-11-12 15:13:40 | 只看该作者

求助:SAS 宏函数的返回值

我现在想设个宏函数,需要返回值,程序如下;
%marco a(add,city);
  %if index(&add,'ab')>0 %then &city=1;
%mend a;
data b;
   set c;
   if d=3 then %a(add,city);
run;
/* add='abdc' */
请问这样能得到city的返回值吗?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2008-11-12 16:37:27 | 只看该作者

Re: 求助:SAS 宏函数的返回值

可以,但是要加%let在赋值语句前面
....
%let &city=1;
....

另外,你的data步中的语句有点问题,
if d=3 then %a(add,city);
这句话总显得有点不伦不类,
建议先调用宏a,然后再使用宏变量city:
%let add=abdc;
%a(&add,city);
data b;
   set c;
   if d=3 then d=&city;
run;
...
具体在data步中怎么使用变量city,看你自己的需要而定了。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2008-11-13 08:25:19 | 只看该作者

Re: 求助:SAS 宏函数的返回值

谢谢楼上的帮忙,我想请问如果变量是来自一个数据集中,而非自定义的宏变量,那么应该如何在DATA步中应用宏函数呢?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2008-11-13 10:06:30 | 只看该作者

Re: 求助:SAS 宏函数的返回值

既然是数据集中的变量,为什么要用宏函数呢?大多数宏函数实现的功能在data 步中都有对应的函数可以调用。例如 宏函数%substr, 在数据集中就用substr函数,功能类似,但是一个是宏函数,一个是数据集函数。
如果非要对数据集中的变量用宏函数,那么可以先把数据集变量变成宏变量,例如:
data _null_;
     set 数据集;
     call symputx('宏变量名', 数据集变量,G或L);
run;
%宏函数(宏变量);
....
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2008-11-13 10:20:55 | 只看该作者

Re: 求助:SAS 宏函数的返回值

但是我想将数据集中的变量add通过宏函数进行比较后,再 在数据集中新建个变量CITY以记录ADD的比较结果,那这应该怎么做呢?
谢谢
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2008-11-13 10:33:54 | 只看该作者

Re: 求助:SAS 宏函数的返回值

看你上面的程序,你是想要比较一下变量里面是否含有某个字符串吧,那也可以用数据集函数index,不要用宏函数%index,例如:

data aaa;
     x='beijing';
     output;
     x='nanjing';
     output;
run;
data bbb(keep x y);
     set aaa;
     if index(x,'bei') > 0 then
          y=1;
     else
          y=0;
run;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2008-11-13 11:53:20 | 只看该作者

Re: 求助:SAS 宏函数的返回值

我就是用INDEX函数做,但是我要比较的字段超过10个,所以想用宏函数使程序简洁些^_^
例如
if index(add,'a1')>0 then city='a1';
else if index(add,'a2')>0 then city='a2';
:
:
else city=' ';
这样,通过宏函数返回比较后的city值,并且存在于数据集中,请问这怎么办呢?
谢谢
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2008-11-13 13:52:35 | 只看该作者

Re: 求助:SAS 宏函数的返回值

[quote="parnwang":3tszvsco]我就是用INDEX函数做,但是我要比较的字段超过10个,所以想用宏函数使程序简洁些^_^
例如
if index(add,'a1')>0 then city='a1';
else if index(add,'a2')>0 then city='a2';
:
:
else city=' ';
这样,通过宏函数返回比较后的city值,并且存在于数据集中,请问这怎么办呢?
谢谢[/quote:3tszvsco]
如果有10个以上的字段需要比较的话,那调用index 超过10次是免不了的,就算放在宏里面,也要调用超过10次的,所以宏并不能够降低程序复杂度的,就这样做就可以了。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
9#
 楼主| 发表于 2008-11-13 14:07:14 | 只看该作者

Re: 求助:SAS 宏函数的返回值

我想通过这个程序能学习下如何利用宏函数返回值,就像C/C++中通过全局函数的参数引用达到返回修改参数的目的,请问宏函数应该怎么做呢?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
10#
 楼主| 发表于 2008-11-13 14:30:51 | 只看该作者

Re: 求助:SAS 宏函数的返回值

有两种方法:
1)带参数的返回值,
宏定义:
%macro test1(var);
....
%let &var=1;
....
%mend;
宏调用:
%local ret;
%test1(ret);
%put return is:&ret;
....

2)直接写宏的返回值,注意这个前提条件是宏定义中不能有data步和proc步。
宏定义:
%macro test2(a,b);
%if a < b %then %do;
1
%end;
%else %do;
0
%end;
%mend;

宏调用:

%let x=100;
%let y=200;
%let ret=%test2(x,y);
%put return is:&ret;
....

主要就这两种方式的返回值,前一种方法使用居多就是在参数前面加上“&”再赋值。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-5 03:28 , Processed in 0.074175 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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