我有一个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()
评估数值条件时。
如果你没有任何价值传递为什么要使用在所有宏? 这里有一个办法做到这一点使用数据零一步。
%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;