SAS微距功能对宏观经济变量的值条件(SAS Macro function conditional

2019-10-21 13:19发布

我有一个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.========;

Answer 1:

当您使用%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_textnumber_text_2应该是宏,它应该解决您的问题之外访问。

我还建议添加%else%if秒。 这确保了如果其之前的一个是假的每个条件仅被评估。 如果没有%else ,每个条件评估每一次。

作为@DomPazz提到的,它是用一个好主意%sysevalf()评估数值条件时。



Answer 2:

如果你没有任何价值传递为什么要使用在所有宏? 这里有一个办法做到这一点使用数据一步。

%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 Macro function conditional on value of Macro Variable
标签: sas sas-macro