SAS %if 宏未根据其他条件解析

SAS %if macros not resolving based on other conditions

我有这个宏,即使逻辑似乎有效,它也无法解析。我是 sas 初学者,所以代码可能看起来有点乱。

%let macro1 = 1600;
%let macro2 = 1300;

%if '&macro1.' > '&macro2.' %then %do;
   %let macro3 = increase;
%else %if '&macro1.' < '&macro2.' %then %do;
   %let macro3 = decrease;
%else %if '&macro1.' = '&macro2.' %then %do;
   %let macro3 = stability;
%end;

当我 运行 代码时,没有错误,但 macro3 没有解析,它看起来像:

"在 1600 和 1300 之间有一个 ¯o3."

您缺少 %DO; 语句的 %END; 语句。您真的需要 %DO; 语句吗?当条件为真时,您似乎没有尝试 运行 多个语句。

宏处理器将忽略由单引号字符包围的引号字符串内的宏触发器。因此,您的测试结果将始终是字符串 '&macro1' 小于字符串 '&macro2' 因为数字 1 在字典顺序中出现在数字 2 之前。

要么完全删除引号,要么用双引号字符替换它们。

没有引号,隐含的 %EVAL() 宏函数调用会将字符串 16001300 作为整数进行比较。使用引号,然后 %EVAL() 将字符串 "1600""1300" 作为字符串进行比较。

因此,如果 MACRO1 和 MACRO2 的值应该是数字,则不要在 %IF 条件中包含引号。否则 "1200" 之类的值将小于 "800" 之类的值,因为 8 大于 1.

您还必须将 %IF/%THEN/%ELSE/%IF 的整个序列包装在宏定义中(如果它尚未包含在宏定义中),因为您不能在 open 中嵌套 %IF代码。

%macro testit;
%let macro1 = 1600;
%let macro2 = 1300;

%if &macro1. > &macro2. %then %let macro3 = increase;
%else %if &macro1. < &macro2. %then %let macro3 = decrease;
%else %let macro3 = stability;
%put &=macro3 ;
%mend testit;

%testit;

如果 &MACRO1 和 &MACRO2 不是整数值,那么您将需要明确使用 %SYSEVALF() 来比较它们。

%let macro1 = 16.50;
%let macro2 = 13.00;

%if %sysevalf(&macro1. > &macro2.) %then  ....