以宏变量值为条件的 SAS 宏函数
SAS Macro function conditional on value of Macro Variable
我有一个 SAS 项目 (EGv7.1),它允许用户在第一行指定一个值。然后,根据指定的值调用其他进程。其中之一是分配了一些其他宏变量。下面是我所拥有的,但它似乎没有用。我真的需要 let 语句在序列中排在第一位,但除此之外我愿意接受更改。有什么建议吗?
%let number=8;
%macro my_function();
%if &number=8 %then
%do;
%let number_text=eight;
%let number_text_2=equal to eight;
%end;
%if &number>8 %then
%do;
%let number_text=not eight;
%let number_text_2=greater then eight;
%end;
%if &number<8 %then
%do;
%let number_text=not eight;
%let number_text_2=less than eight;
%end;
%mend my_function;
%my_function();
%put =================&number==================;
%put ===========The number is &number_text.=============;
%put =======Furthermore, the number is &number_text_2.========;
当您在宏中使用 %let
语句时,变量默认为局部作用域。也就是说,它们只存在于宏内部。要解决此问题,请在宏中添加 %global
语句。
%let number = 8;
%macro my_function();
%global number_text number_text_2;
%if %sysevalf(&number = 8) %then
%do;
%let number_text = eight;
%let number_text_2 = equal to eight;
%end;
%else %if %sysevalf(&number > 8) %then
%do;
%let number_text = not eight;
%let number_text_2 = greater than eight;
%end;
%else %if %sysevalf(&number < 8) %then
%do;
%let number_text = not eight;
%let number_text_2 = less than eight;
%end;
%mend my_function;
%my_function();
这告诉 SAS 宏变量 number_text
和 number_text_2
应该可以在宏之外访问,这应该可以解决您的问题。
我还建议将 %else
添加到您的 %if
中。这确保每个条件仅在其前面的条件为假时才被评估。没有%else
,每个条件每次都求值
正如@DomPazz 提到的,在评估数值条件时使用 %sysevalf()
是个好主意。
如果您不传递任何值,为什么还要使用宏?这是使用数据 null 步骤执行此操作的方法。
%let number=3;
data _null_;
if &number=8 then do;
call symputx('number_text_3', "eight", g);
call symputx('number_text_4', "equal to eight", g);
end;
else if &number>8 then do;
call symputx('number_text_3', "not eight", g);
call symputx('number_text_4', "greater than eight", g);
end;
else if &number<8 then do;
call symputx('number_text_3', "not eight", g);
call symputx('number_text_4', "less than eight", g);
end;
run;
%put &number_text_3;
%put &number_text_4;
我有一个 SAS 项目 (EGv7.1),它允许用户在第一行指定一个值。然后,根据指定的值调用其他进程。其中之一是分配了一些其他宏变量。下面是我所拥有的,但它似乎没有用。我真的需要 let 语句在序列中排在第一位,但除此之外我愿意接受更改。有什么建议吗?
%let number=8;
%macro my_function();
%if &number=8 %then
%do;
%let number_text=eight;
%let number_text_2=equal to eight;
%end;
%if &number>8 %then
%do;
%let number_text=not eight;
%let number_text_2=greater then eight;
%end;
%if &number<8 %then
%do;
%let number_text=not eight;
%let number_text_2=less than eight;
%end;
%mend my_function;
%my_function();
%put =================&number==================;
%put ===========The number is &number_text.=============;
%put =======Furthermore, the number is &number_text_2.========;
当您在宏中使用 %let
语句时,变量默认为局部作用域。也就是说,它们只存在于宏内部。要解决此问题,请在宏中添加 %global
语句。
%let number = 8;
%macro my_function();
%global number_text number_text_2;
%if %sysevalf(&number = 8) %then
%do;
%let number_text = eight;
%let number_text_2 = equal to eight;
%end;
%else %if %sysevalf(&number > 8) %then
%do;
%let number_text = not eight;
%let number_text_2 = greater than eight;
%end;
%else %if %sysevalf(&number < 8) %then
%do;
%let number_text = not eight;
%let number_text_2 = less than eight;
%end;
%mend my_function;
%my_function();
这告诉 SAS 宏变量 number_text
和 number_text_2
应该可以在宏之外访问,这应该可以解决您的问题。
我还建议将 %else
添加到您的 %if
中。这确保每个条件仅在其前面的条件为假时才被评估。没有%else
,每个条件每次都求值
正如@DomPazz 提到的,在评估数值条件时使用 %sysevalf()
是个好主意。
如果您不传递任何值,为什么还要使用宏?这是使用数据 null 步骤执行此操作的方法。
%let number=3;
data _null_;
if &number=8 then do;
call symputx('number_text_3', "eight", g);
call symputx('number_text_4', "equal to eight", g);
end;
else if &number>8 then do;
call symputx('number_text_3', "not eight", g);
call symputx('number_text_4', "greater than eight", g);
end;
else if &number<8 then do;
call symputx('number_text_3', "not eight", g);
call symputx('number_text_4', "less than eight", g);
end;
run;
%put &number_text_3;
%put &number_text_4;