打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
SAS岩论 | Macro系列(5)——Macro Variables(2)

Macro系列导读

SAS Macro作为SAS高手不可或缺的一项技能,是因为它功能足够强大,能极大的提升程序开发效率;使你的时间和精力投入在更有价值的事情上。

Macro系列文章,将会逐一奉上SAS Macro的点点滴滴,带你踏上从认识Macro到熟练使用Macro之路。掌握SAS Macro,将会使你的SAS编程能力更上一层楼。

上期文章“Macro Variables(1)”对Macro Variables的进行了整体的介绍。由两大类构成:Automatic Macro Variables和User-Defined Macro Variables;阐述了它们之间的异同点。针对User-Defined Macro Variables,介绍了常用的定义方法、使用,及删除的操作。

Macro系列(5)—Macro Variable(2)

本期文章对Macro Variable的存储方式进行大致介绍,重点对Macro Variables的间接引用方式进行详细阐述,此种方式在数据处理中特别常用,其功能也比较强大。

Macro Variables存储

在上期文章中说到Macro Variables和Data Step中的Variables是没有任何关系的,后者是来自于Data Set,或者其他数据源;那么前者又是来自哪里的?

其实Macro Variables也是类似的存储方式,是存储在“Symbol Table”中。它是由Macro Processor在SAS启动时自动创建并维护的。SAS提供了一张视图来供我们查看Symbol Table中的内容,其位于SASHELP逻辑库下:“SASHELP.VMACRO”,如下所示:

小拓展

 

对于User-Defined Macro Variables来说,可根据其使用范围(Scope)分为两种:Global、Local

  • 其中Global Macro Variables是可以在任何地方使用;

  • 而Local Macro Variables是和Macro Program紧密联系的,只能在当前的Macro Program中使用。

相对应的,Symbol Table也分为Global Symbol TableLocal Symbol Table(Automatic Macro Variables中了除了SYSPBUFF,都属于Global)。

因此,上面提到的SASHELP.VMACRO,准确来讲只包含Global Symbol Table中的内容。Local Symbol Table仅存在于Macro Program运行的阶段,无法像Global Symbol Table那样直接通过视图来查看。关于Global和Local,此处不再详细介绍,在后期文章中讲到Macro Program时再具体说明。

间接引用Macro Variable

一般情况下,我们通过“&”来引用一个Macro Variable,例如:“&SYSDATE”。称之为“直接引用”。那么什么叫做“间接引用”呢?

就是通过一个Macro Variable得到另外一个Macro Variable的值。先来看一个例子:

%let a=b;

%let b=John;

此处创建了两个Macro Variables:ab。其中a的值是“b”,b的值是“John”。如果想要在程序中使用“John”这个值,那么可以直接通过b来获取。例如:

小贴士:单引号与双引号

不同语言中,单引号与双引号有不同的用处。在SAS中,单引号和双引号都是表示字符串,在不用Macro的时候是没有任何区别的。针对Macro,只有一个区别:“单引号中的Macro Trigger不会启动Macro Processor,相当于普通字符;而双引号中的会启动Macro Processor”。

如果想通过a来得到“John”这个值,有没有办法得到呢?

没错,是可以的。这就是间接引用,通过一个Macro Variable得到另外一个Macro Variable的取值。

间接引用的三种类型

  1. 一个Macro Variable的取值是另外一个Macro Variable的名字;

  2. 一个Macro Variable的取值是另外一个Macro Variable名字的前半部分;

  3. 一个Macro Variable的取值是另外一个Macro Variable名字的后半部分;


下面通过实例一一进行说明:

一个Macro Variable的取值是另外一个Macro Variable的名字

一个Macro Variable的取值是另外一个Macro Variable名字的前半部分

特别注意

a与person之间有一个小数点“.”。如果没有这个小数点,会把aperson当做一个Macro Variable。但实际上是没有这个Macro Variable的,这个“.”就是为了将Macro Variable Name与其他字符区分开来。

一个Macro Variable的取值是另外一个Macro Variable名字的后半部分

看完这三种类型的间接引用,或许会把你看得一脸懵。有些地方是“&&”,有些地方是“&&&”,还有些地方有“.”,到底是什么意思?

原理阐述

对于含有多个“&”的间接引用方式,Macro Processor会进行多次解析,得到最终的结果。下面对解析过程进行剖析,将每一步的过程都展示出来,各位肯定就清楚了。

首先需要记住三点:

  • 如果解析过程中遇到连续的两个“&&”会把它解析为一个“&”;

  • 如果解析完的结果中还有“&”,会触发第二次解析;

  • 如果解析过程中遇到“.”,当做分隔符处理,其不会出现在解析结果中;

来看这段程序:

能否理解这个结果?

如果不理解,看完下面这张彩图,保证你豁然开朗:

基于张图详细解析图,结合前面说到的三个要点,相信各位就会基本明白是怎么回事了。不管有多少个“&”,只要一层层去分析,就知道最终结果会是什么了。

下面看看前面提到的三种间接引用类型的具体解析过程(注意,第二种方式中的小数点,在第一次解析完成之后就不存在了):

小拓展

你或许会发现上面这些间接引用好像都是两层的,有没有更多层级的引用?

不用怀疑,绝对有。想要多少层都可以,只需要加“&”就可以。这么高深的用法,就等着你们去探索了。

本期文章到这就结束了,对存储Macro Variables的Symbol Table进行了介绍;对Global和Local进行大致描述,具体细节后文阐述。重点对Macro Variables的间接引用方式进行详细的说明,这种间接引用方式在封装一些功能的时候经常会用到。等下期文章介绍完Macro Program后,会有实际的案例进行说明。更多内容,请持续关注SAS中文论坛——“SAS岩论-Macro系列”。

 

作者:辛岩,从事了多年的SAS数据分析挖掘工作,担任过项目经理、技术顾问、培训讲师等职务,拥有丰富的项目实战经验。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Technicals writings from JLH: Global Offset Table, why is it needed?
sas优化技巧-条件语句的正确选择(select,if,where,having)
SAS EXCEL转换
【转载】CMake 两种变量原理
MySQL 数据库上线后根据 status 状态优化
Check Lua source code for various errors.
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服