SAS宏功能以宏变量的值为条件

时间:2015-01-08 16:18:32

标签: sas sas-macro

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

2 个答案:

答案 0 :(得分:3)

在宏中使用%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。这可确保仅在前面的条件为false时评估每个条件。如果没有%else,则每次都会评估每个条件。

正如@DomPazz所提到的,在评估数字条件时使用%sysevalf()是一个好主意。

答案 1 :(得分:1)

如果您没有传递任何值,为什么要使用宏呢?这是使用数据 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;