SAS中文论坛

标题: 求助:SAS 宏函数的返回值 [打印本页]

作者: shiyiming    时间: 2008-11-12 15:13
标题: 求助: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的返回值吗?
作者: shiyiming    时间: 2008-11-12 16:37
标题: 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,看你自己的需要而定了。
作者: shiyiming    时间: 2008-11-13 08:25
标题: Re: 求助:SAS 宏函数的返回值
谢谢楼上的帮忙,我想请问如果变量是来自一个数据集中,而非自定义的宏变量,那么应该如何在DATA步中应用宏函数呢?
作者: shiyiming    时间: 2008-11-13 10:06
标题: Re: 求助:SAS 宏函数的返回值
既然是数据集中的变量,为什么要用宏函数呢?大多数宏函数实现的功能在data 步中都有对应的函数可以调用。例如 宏函数%substr, 在数据集中就用substr函数,功能类似,但是一个是宏函数,一个是数据集函数。
如果非要对数据集中的变量用宏函数,那么可以先把数据集变量变成宏变量,例如:
data _null_;
     set 数据集;
     call symputx('宏变量名', 数据集变量,G或L);
run;
%宏函数(宏变量);
....
作者: shiyiming    时间: 2008-11-13 10:20
标题: Re: 求助:SAS 宏函数的返回值
但是我想将数据集中的变量add通过宏函数进行比较后,再 在数据集中新建个变量CITY以记录ADD的比较结果,那这应该怎么做呢?
谢谢
作者: shiyiming    时间: 2008-11-13 10:33
标题: 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;
作者: shiyiming    时间: 2008-11-13 11:53
标题: Re: 求助:SAS 宏函数的返回值
我就是用INDEX函数做,但是我要比较的字段超过10个,所以想用宏函数使程序简洁些^_^
例如
if index(add,'a1')>0 then city='a1';
else if index(add,'a2')>0 then city='a2';
:
:
else city=' ';
这样,通过宏函数返回比较后的city值,并且存在于数据集中,请问这怎么办呢?
谢谢
作者: shiyiming    时间: 2008-11-13 13:52
标题: 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次的,所以宏并不能够降低程序复杂度的,就这样做就可以了。
作者: shiyiming    时间: 2008-11-13 14:07
标题: Re: 求助:SAS 宏函数的返回值
我想通过这个程序能学习下如何利用宏函数返回值,就像C/C++中通过全局函数的参数引用达到返回修改参数的目的,请问宏函数应该怎么做呢?
作者: shiyiming    时间: 2008-11-13 14:30
标题: 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;
....

主要就这两种方式的返回值,前一种方法使用居多就是在参数前面加上“&”再赋值。
作者: shiyiming    时间: 2008-11-13 14:39
标题: Re: 求助:SAS 宏函数的返回值
那我上面的这个程序为什么无法得到CITY的返回值呢?
作者: shiyiming    时间: 2008-11-13 14:53
标题: Re: 求助:SAS 宏函数的返回值
你这个程序宏定义错了,index只有在data步中使用的,
应该改成宏函数%index,
%if %index(&add,ab)>0 %then %let &city=1;

另外,你的data步也不对,
首先在宏会在data步执行前被执行,宏是不会随着data步的语句执行的,
其次add是数据集变量,不能直接用在%a中调用的,我前面已经说了,如果非要在%a中使用add,那么应该用call symput把add转成宏变量。
但我认为,你这个问题的解决思路不正确了,这个问题不应该这么解决,建议直接使用data步:
data b;
set c;
if index(add,'ab') > 0 then city=1
else if index(add,'bc') > 0 then city=2;
....
else city =n;
run;
作者: shiyiming    时间: 2008-11-13 15:22
标题: Re: 求助:SAS 宏函数的返回值
我再好好想想
谢谢了
如有不懂的地方,我再向你请教 <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->




欢迎光临 SAS中文论坛 (https://mysas.net/forum/) Powered by Discuz! X3.2