📅  最后修改于: 2021-01-08 14:31:38             🧑  作者: Mango
SAS提供了称为Macro的强大编程功能。宏基本上有助于在不同位置多次重用代码,因此我们不需要重复键入整个代码。它不仅减少了时间,而且生成了无错误的代码。
宏由一组由特定名称指定的SAS语句组成,因此可以通过使用该名称在程序中的任何位置使用它。它的语法以%Macro语句开始,以%MEND语句结束。
宏也可以在代码块中声明,以便可以将这些块多次重用为宏变量。
创建宏的语法:
%MACRO (Param1, Param2,....Paramn);
Macro Statements;
%MEND;
调用宏的语法:
%MacroName (Value1, Value2,....,Valu en);
哪里,
让我们通过一个例子来了解Macro:
在这里,我们正在创建两个数据集。一个是样本,另一个是演示。要运行这些数据集,我们需要在两个数据集中都使用proc打印语句。此proc打印语句将在同一程序中写入两次,因为代码的长度将不必要地增加。为了减少此不必要的长度,我们使用Macro。
在下面的代码中,我们将为proc打印语句创建一个由pri指定的宏。
这是不带宏的常规代码:
Data sample;
Set sashelp.airline;
Run;
proc print;
run;
Data Demo;
setsashelp.cars;
Run;
proc print;
run
通过使用Macro,我们可以重用此proc打印语句。在下面的代码中,我们将为proc打印语句创建Macro pri ,以便我们可以在需要的地方使用它。
Data sample;
Set sashelp.airline;
run;
%pri;
Data Demo;
setsashelp.cars;
run;
%pri;
%Macro pri;
proc print;
run;
%mend;
这些变量包含一个SAS程序重复使用的值。我们可以在SAS程序的开头声明Macro变量,然后在程序主体中将它们调出。
宏变量的范围可以是Global或Local 。这些定义如下:
全局宏变量可以由SAS环境中可用的任何SAS程序访问。通常,这些是系统分配的变量,可以由多个程序访问。全局宏变量的典型示例是系统日期。
例
在以下示例中,我们将使用全局SAS变量SYSDATE ,它表示系统日期。
考虑一种情况,当我们生成报告时,我们需要每天在SAS报告的标题中打印系统日期。
标题将显示当前日期和日期,而在代码中未提供任何值。在这里,我们使用SASHELP库中提供的称为CARS的SAS内置数据集。
proc print data = sashelp.cars;
where make = 'Audi' and type = 'Sports' ;
TITLE "Sales as of &SYSDAY &SYSDATE";
run;
当我们在SAS Studio中执行上述代码时,将获得以下输出。
局部变量只能在声明它们的SAS程序中访问。它们通常用于在同一SAS语句中提供不同的变量,以处理对数据集的不同观察结果。
句法:
% LET (Macro Variable Name) = Value;
哪里,
例:
宏变量可以通过在变量名的开头附加的字符和声明。在下面的示例中,我们将声明两个局部变量,一个是make_name ,另一个是type_name,以从CARS数据集中获取值。
考虑以下代码:
%LET make_name = 'Audi'; /*Defining Macro Variable*/
%LET type_name = 'Wagon';
proc print data = sashelp.cars;
where make = &make_name and type = &type_name ;/*referencing Macro Variable*/
TITLE "Sales as of &SYSDAY &SYSDATE";
run;
当我们在SAS Studio中执行上述代码时,将获得以下输出。
SAS具有许多内置的MACRO语句,可以在任何SAS程序中使用它们,而无需明确声明它们。以下是最常用的宏:
该宏语句用于将文本或宏变量信息写入SAS日志。在下面的示例中,我们将把变量“ today”的值写入程序日志。
Data _null_;
CALL SYMPUT ('today',
TRIM(PUT("&sysdate"d,worddate22.)));
run;
%put &today;
data _null_;
CALL SYMPUT ('today',
TRIM(PUT("&sysdate"d,worddate22.)));
run;
%put &today;
在SAS Studio中执行以上代码:
输出:
按照上述代码,已将变量“ today”的值“&sysdate” d,worddate22。”写入程序日志。
当确定某个条件为真时,此Macro语句用于终止当前正在执行的Macro。在下面的示例中,如果将值1分配给变量var1,则宏将停止执行,并且DATA步骤将不会执行。
%macro checkit(var1);
%if &var1 = 1 %then %return;
data a;
x=10;
run;
%mend checkit;
%checkit(0)
%checkit(1)
在SAS Studio中执行以上代码:
输出:
按照上面的代码,条件已被评估为真,因此终止正在执行的宏,并且尚未执行数据步骤。
根据要求,此宏语句用于结束%DO%WHILE循环。我们可以将其与%END语句一起使用。在下面的示例中,名为demo的宏接受输入1,并使用此输入值运行DO循环。 DO循环使用%End语句关闭,而Macro语句使用%mend语句关闭。
%macro demo(finish);
%let i=1;
%do %while (&i<&finish);
%put the value of i is &i;
%let i=%eval(&i+1);
%end;
%mend demo;
%demo(6)
在SAS Studio中执行以上代码:
输出:
根据上面的代码, i的值已打印5次,完成5次后,%End语句结束%Do%While循环。