全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
1724 6
2012-10-28
悬赏 500 个论坛币 已解决
bobguy老师你好,我发过几次求助帖,你给出的解答都很厉害,但是我都权衡选择了别人的答案,望你别介意。

我想再问你一个问题,我近来常常会遇到:

复制代码
如代码中,我想在某个宏参数中加入识别菜单的形式,例如我的宏中提供四种功能:rjym。我想用第一个参数无论顺序和大小写,指明这个宏下面要包括的内容。

代码中,字符串Rjm,我实际想直接表达的意思如下:

%if (%substr(&vt,3,1)^=m) %then 如何如何。。。

不过报错,①请问%if内可以比较字符么?谢谢。

另外:②上面引用代码会报错,内容是:宏引用没有提及‘y’,所以出现rank(.)的情况,请问如果一定这样写的话,有办法优化么。谢谢。

最佳答案

davil2000 查看完整内容

1. %if 语句中可以使用比较运算符; 2. 嵌套多了会降低编译效率,也不易发现错误。 %macro check(vt); %do i=1 %to 3; data _null_; x= substr("&vt", &i,1); y= rank(x); call symput('tx',x); call symput('ty',y); run; %if (&ty=82 or &ty=114) %then %let r=1; %if (&ty=74 or &ty=106) %then %let j=1; %if (&ty=89 or &ty=121) %then %let y=1; %if (&ty=77 or &ty=109) %then %let m=1 ...
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2012-10-28 13:32:14
1. %if 语句中可以使用比较运算符;
2. 嵌套多了会降低编译效率,也不易发现错误。

%macro check(vt);
%do i=1 %to 3;

  data _null_;
  x= substr("&vt", &i,1);
  y= rank(x);
  call symput('tx',x);
  call symput('ty',y);
  run;

  %if (&ty=82 or &ty=114) %then %let r=1;
  %if (&ty=74 or &ty=106) %then %let j=1;
  %if (&ty=89 or &ty=121) %then %let y=1;
  %if (&ty=77 or &ty=109) %then %let m=1;
  %put *--- The ASCII position of "%trim(&tx)" is %left(&ty) %str(---*);

%end;
%mend;

%check(Rjm);


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2012-11-1 16:42:34
%macro check(vt);
%do i=1 %to 3;
%let tx = %substr(&vt,&i,1);
%let ty= %sysfunc(rank(%substr(&vt, &i,1)));
/*  %if (&ty=82 or &ty=114) %then %let r=1;*/
/*  %if (&ty=74 or &ty=106) %then %let j=1;*/
/*  %if (&ty=89 or &ty=121) %then %let y=1;*/
/*  %if (&ty=77 or &ty=109) %then %let m=1;*/
  %put *--- The ASCII position of "%trim(&tx)" is %left(&ty) %str(---*);
%end;
%mend;

%check(Rjm);
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2012-11-1 17:50:55
davil2000 发表于 2012-11-1 14:37
1. %if 语句中可以使用比较运算符;
2. 嵌套多了会降低编译效率,也不易发现错误。
感谢davil老师指点,不过您用的也是rank方法;我知道在data步中可以用字符之间的比较,不过宏里面似乎不可以。呵呵,只好妥协了。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2012-11-1 18:53:43
Tigflanker 发表于 2012-11-1 17:50
感谢davil老师指点,不过您用的也是rank方法;我知道在data步中可以用字符之间的比较,不过宏里面似乎不可 ...
%IF expression %THEN action;  
<%ELSEaction;>  

Here,expression is any macro expression that resolves to an integer.  One can use arithmetic and logical expressions in specific macro functions and statements.Of course, he can also do some comparison in these expressions.

Expressions in which comparison operators surround a macro expression, as in 10<&X<20, may or may not be the equivalent of a DATA step compound expression (depending on what the expression resolves into). To be safe, write the connecting operator explicitly, as in the expression 10<&X AND &X<20.
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2012-11-1 19:49:42
davil2000 发表于 2012-11-1 18:53
%IF expression %THEN action;
学习了 感谢分享
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群