SAS - 宏



SAS 具有一个强大的编程功能,称为,它允许我们避免重复的代码段,并在需要时反复使用它们。它还有助于在代码中创建动态变量,这些变量可以在同一代码的不同运行实例中取不同的值。宏也可以为代码块声明,这些代码块将以类似于宏变量的方式重复使用多次。我们将在下面的示例中看到这两者。

宏变量

这些变量保存一个值,该值将被 SAS 程序反复使用。它们在 SAS 程序的开头声明,并在程序主体中稍后调用。它们的范围可以是全局的或局部的。

全局宏变量

它们被称为全局宏变量,因为 SAS 环境中任何可用的 SAS 程序都可以访问它们。通常,它们是系统分配的变量,多个程序可以访问它们。一个常见的示例是系统日期。

示例

下面是一个名为 SYSDATE 的 SAS 变量的示例,它表示系统日期。考虑一个场景,每天生成报表时,在 SAS 报表的标题中打印系统日期。标题将显示当前日期和星期几,而无需我们为它们编码任何值。我们使用 SASHELP 库中可用的名为 CARS 的内置 SAS 数据集。

proc print data = sashelp.cars;
where make = 'Audi' and type = 'Sports' ;
   TITLE "Sales as of &SYSDAY &SYSDATE";
run;

运行上述代码后,我们将获得以下输出。

Global Macro Result

局部宏变量

这些变量可以被声明为程序一部分的 SAS 程序访问。它们通常用于向相同的 SAS 语句提供不同的变量,以便它们可以处理数据集的不同观测值。

语法

局部变量使用以下语法声明。

% LET (Macro Variable Name) = Value;

此处,Value 字段可以根据程序需要采用任何数值、文本或日期值。宏变量名称是任何有效的 SAS 变量。

示例

SAS 语句使用在变量名称开头附加的&字符来使用这些变量。下面的程序获取制造商为“Audi”且类型为“Sports”的所有观测值。如果我们想要不同制造商的结果,我们需要更改变量make_name的值,而无需更改程序的任何其他部分。在程序中,此变量可以在任何 SAS 语句中反复引用。

%LET make_name = 'Audi';
%LET type_name = 'Sports';
proc print data = sashelp.cars;
where make = &make_name and type = &type_name ;
   TITLE "Sales as of &SYSDAY &SYSDATE";
run;

运行上述代码后,我们将获得与上一个程序相同的输出。但是,让我们将类型名称更改为'Wagon'并运行相同的程序。我们将得到以下结果。

Local Macro Result

宏程序

宏是一组 SAS 语句,由名称引用,并在程序中的任何位置使用该名称来使用它。它以 %MACRO 语句开头,以 %MEND 语句结束。

语法

局部变量使用以下语法声明。

# Creating a Macro program.
%MACRO <macro name>(Param1, Param2,….Paramn);

Macro Statements;

%MEND;

# Calling a Macro program.
%MacroName (Value1, Value2,…..Valuen);

示例

下面的程序在名为'show_result'的宏下声明了一组 SAT 语句;此宏由其他 SAS 语句调用。

%MACRO show_result(make_ , type_);
proc print data = sashelp.cars;
where make = "&make_" and type = "&type_" ;
   TITLE "Sales as of &SYSDAY &SYSDATE";
run;
%MEND;

%show_result(BMW,SUV);

运行上述代码后,我们将获得以下输出。

Program Macro Result

常用宏

SAS 有许多宏语句,它们是 SAS 编程语言的内置语句。它们由其他 SAS 程序使用,无需显式声明。常见的示例包括 - 在满足某些条件时终止程序或在程序日志中捕获变量的运行时值。以下是一些示例。

宏 %PUT

此宏语句将文本或宏变量信息写入 SAS 日志。在下面的示例中,变量“today”的值被写入程序日志。

data _null_;
CALL SYMPUT ('today',
TRIM(PUT("&sysdate"d,worddate22.)));
run;
%put &today;

运行上述代码后,我们将获得以下输出。

Macro Put

宏 %RETURN

当某些条件评估为真时,执行此宏会导致当前正在执行的宏正常终止。在下面的示例中,当变量"val"的值变为 10 时,宏终止,否则它继续执行。

%macro check_condition(val);
   %if &val = 10 %then %return;

   data p;
      x = 34.2;
   run;  

%mend check_condition;  

%check_condition(11)  ;

运行上述代码后,我们将获得以下输出。

Macro Return

宏 %END

此宏定义包含一个%DO %WHILE循环,该循环根据需要以 %END 语句结束。在下面的示例中,名为 test 的宏获取用户输入并使用此输入值运行 DO 循环。DO 循环的结束通过 %end 语句实现,而宏的结束通过 %mend 语句实现。

%macro test(finish);
   %let i = 1;
   %do %while (&i <&finish);
      %put the value of i is &i;
      %let i=%eval(&i+1);
   %end;
%mend test;
%test(5)

运行上述代码后,我们将获得以下输出。

Macro do Finish
广告