什么是SAS宏?

17 Mar 2025 | 5 分钟阅读

SAS提供了一个强大的编程特性,称为。 宏主要用于在不同地方多次重用代码,这样我们就无需重复键入整个代码。 它不仅减少了时间,还生成了无错代码。

宏由一组SAS语句组成,这些语句由一个特定的名称指定,以便可以通过使用该名称在程序的任何位置使用它。它的语法以%Macro语句开始,以%MEND语句结束。

宏也可以在代码块中声明,以便可以将块多次重用于宏变量中。

SAS Macro

创建宏的语法

调用宏的语法

其中,

  • %MACRO: 这是一个用于创建宏的语句。
  • 宏名称: 这是给宏的名称。我们可以通过这个名称在任何地方调用宏。
  • 参数: 这些是给宏的参数,用于执行操作。
  • 宏语句: 这些是可以直接使用的SAS内置宏语句。
  • %MEND: 这是一个用于关闭宏的语句。
  • 值: 这些是变量的值,给宏用于执行操作。

让我们通过一个例子来理解宏

这里我们创建了两个数据集。一个是一个样本,另一个是一个演示。要运行这些数据集,我们需要在两个数据集中使用proc print语句。这个proc print语句将在同一个程序中被写入两次,因此代码的长度将不必要地增加。为了减少这种不必要的长度,我们使用宏。

在下面的代码中,我们将创建一个由pri指定的宏,用于proc print语句。

示例

这是一个没有宏的常规代码

通过使用宏,我们可以重用这个proc print语句。在下面的代码中,我们正在为proc print语句创建宏pri,以便我们可以在需要的地方使用它。

SAS宏的优点

  • 它通过定义一次代码并多次重用代码来简化我们的工作。
  • 我们可以在一个地方更改一个变量,它将反映在多个地方。
  • 程序的数据由数据驱动,即SAS根据实际数据值决定做什么。
  • 它减少了代码的时间。
  • 它降低了代码的复杂性。

宏变量

这些变量包含一个值,该值被SAS程序重复使用。我们可以在SAS程序的开头声明宏变量,并在程序的正文中稍后调用它们。

宏变量的作用域可以是全局局部。 这些定义如下

全局宏变量

全局宏变量可以被SAS环境中可用的任何SAS程序访问。通常,这些是系统分配的变量,可以被多个程序访问。全局宏变量的一个典型例子是系统日期。

示例

在下面的例子中,我们将使用全局SAS变量SYSDATE,它代表系统日期。

考虑这样一种情况:当生成报告时,我们需要每天在SAS报告的标题中打印系统日期。

标题将显示当前日期和星期几,而无需在代码中为它们提供任何值。这里我们使用SAS内置的数据集,称为CARS,它位于SASHELP库中。

当我们在SAS Studio中执行上述代码时,我们得到以下输出。

SAS Macro

局部宏变量

局部变量只能在声明它们的SAS程序中访问。它们通常用于在同一SAS语句中提供不同的变量,以处理数据集的不同观察值。

语法

其中,

  • % LET: 它创建一个宏变量并为其赋值。
  • 宏变量名称: 这是给局部宏变量的名称。
  • 值: 这是一个值字段,它可以根据程序的要求采用任何数值、文本或日期值。

示例

宏变量可以通过在变量名称的开头附加字符&来声明。在下面的例子中,我们将声明两个局部变量,一个是make_name,另一个是type_name,以从CARS数据集中获取值。

考虑以下代码

当我们在SAS Studio中执行上述代码时,我们得到以下输出。

SAS Macro

常用宏

SAS有许多内置的宏语句,可以在任何SAS程序中使用,而无需显式声明它们。以下是最常用的宏

  • 宏 %PUT
  • 宏 %RETURN
  • 宏 %END

宏 %PUT

这个宏语句用于将文本或宏变量信息写入SAS日志。在下面的例子中,我们将变量“today”的值写入程序日志。

在 SAS Studio 中执行上述代码

SAS Macro

输出

SAS Macro

根据上面的代码,变量“today”的值"&sysdate"d,worddate22."已被写入程序日志。

宏 %RETURN

当某个条件被评估为真时,这个宏语句用于终止当前正在执行的宏。在下面的例子中,如果值1被分配给变量var1,那么宏将停止执行,并且DATA步骤将不会执行。

在 SAS Studio 中执行上述代码

SAS Macro

输出

SAS Macro

根据上面的代码,条件已经被评估为真,因此执行宏被终止,并且数据步骤没有被执行。

宏 %END

根据需要,这个宏语句用于结束一个%DO %WHILE循环。我们可以将它与%END语句一起使用。在下面的例子中,名为demo的宏接受输入1,并通过使用这个输入值来运行DO循环。DO循环以%End语句结束,而宏语句以%mend语句结束。

在 SAS Studio 中执行上述代码

SAS Macro

输出

SAS Macro

根据上面的代码,i的值已经被打印了5次,并且在完成5次之后,%End语句结束了%Do %While循环。


下一个主题SAS-频率分布