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;
当上面的代码运行时,我们得到以下输出。
局部宏变量
这些变量可以被 SAS 程序访问,在这些程序中它们被声明为程序的一部分。 它们通常用于为相同的 SAS 语句 sl 提供不同的变量,从而可以处理数据集的不同观察结果。
语法
局部变量使用以下语法声明。
% LET (Macro Variable Name) = Value;
这里的值字段可以根据程序的需要采用任何数字、文本或日期值。 宏变量名称是任何有效的 SAS 变量。
示例
变量由 SAS 语句使用 & 附加在变量名开头的字符。 下面的程序让我们看到了"Audi"奥迪品牌和"Sports"体育的所有信息。 如果我们想要不同的 make 的结果,我们需要改变变量 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;
当上面的代码运行时,我们得到与前一个程序相同的输出。但是让我们将 type name 更改为 'Wagon' 并运行相同的程序。我们将得到以下结果。
宏程序
宏是一组 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);
当上面的代码运行时,我们得到以下输出。
常用宏
SAS 有许多内置在 SAS 编程语言中的 MACRO 语句。 它们被其他 SAS 程序使用而没有明确声明它们。常见的例子是 - 在满足某些条件时终止程序或在程序日志中捕获变量的运行时值。 下面是一些例子。
宏 %PUT
此宏语句将文本或宏变量信息写入 SAS 日志。 在下面的示例中,变量"today"的值被写入程序日志。
data _null_; CALL SYMPUT ('today', TRIM(PUT("&sysdate"d,worddate22.))); run; %put &today;
当上面的代码运行时,我们得到以下输出。
宏 %RETURN
当某些条件评估为真时,执行此宏会导致当前执行的宏正常终止。 在下面的示例中,当变量 "val" 的值变为 10 时,宏将终止,否则将继续。
%macro check_condition(val); %if &val = 10 %then %return; data p; x = 34.2; run; %mend check_condition; %check_condition(11) ;
当上面的代码运行时,我们得到以下输出。
宏 %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)
当上面的代码运行时,我们得到以下输出。