SAS %if 宏未根据其他条件解析
SAS %if macros not resolving based on other conditions
我有这个宏,即使逻辑似乎有效,它也无法解析。我是 sas 初学者,所以代码可能看起来有点乱。
%let macro1 = 1600;
%let macro2 = 1300;
%if '¯o1.' > '¯o2.' %then %do;
%let macro3 = increase;
%else %if '¯o1.' < '¯o2.' %then %do;
%let macro3 = decrease;
%else %if '¯o1.' = '¯o2.' %then %do;
%let macro3 = stability;
%end;
当我 运行 代码时,没有错误,但 macro3 没有解析,它看起来像:
"在 1600 和 1300 之间有一个 ¯o3."
您缺少 %DO;
语句的 %END;
语句。您真的需要 %DO;
语句吗?当条件为真时,您似乎没有尝试 运行 多个语句。
宏处理器将忽略由单引号字符包围的引号字符串内的宏触发器。因此,您的测试结果将始终是字符串 '¯o1'
小于字符串 '¯o2'
因为数字 1 在字典顺序中出现在数字 2 之前。
要么完全删除引号,要么用双引号字符替换它们。
没有引号,隐含的 %EVAL()
宏函数调用会将字符串 1600
和 1300
作为整数进行比较。使用引号,然后 %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 ¯o1. > ¯o2. %then %let macro3 = increase;
%else %if ¯o1. < ¯o2. %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(¯o1. > ¯o2.) %then ....
我有这个宏,即使逻辑似乎有效,它也无法解析。我是 sas 初学者,所以代码可能看起来有点乱。
%let macro1 = 1600;
%let macro2 = 1300;
%if '¯o1.' > '¯o2.' %then %do;
%let macro3 = increase;
%else %if '¯o1.' < '¯o2.' %then %do;
%let macro3 = decrease;
%else %if '¯o1.' = '¯o2.' %then %do;
%let macro3 = stability;
%end;
当我 运行 代码时,没有错误,但 macro3 没有解析,它看起来像:
"在 1600 和 1300 之间有一个 ¯o3."
您缺少 %DO;
语句的 %END;
语句。您真的需要 %DO;
语句吗?当条件为真时,您似乎没有尝试 运行 多个语句。
宏处理器将忽略由单引号字符包围的引号字符串内的宏触发器。因此,您的测试结果将始终是字符串 '¯o1'
小于字符串 '¯o2'
因为数字 1 在字典顺序中出现在数字 2 之前。
要么完全删除引号,要么用双引号字符替换它们。
没有引号,隐含的 %EVAL()
宏函数调用会将字符串 1600
和 1300
作为整数进行比较。使用引号,然后 %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 ¯o1. > ¯o2. %then %let macro3 = increase;
%else %if ¯o1. < ¯o2. %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(¯o1. > ¯o2.) %then ....