美文网首页
207:macro base(二)

207:macro base(二)

作者: SASPRO的打工人生活 | 来源:发表于2023-03-25 21:59 被阅读0次

    宏系列的文章主要是参考书籍《Carpenter’s Complete Guide to the SAS Macro Language》以及其他一些论文,再加上自己的一些理解,仅供学习交流用。

    上一次文章简单介绍了一下宏的基本知识:

    191:macro base(一)

    今天我们接着学习,对于包含宏语句的SAS代码,有以下几个问题:

    ①:在data步中,if语句能代替%if宏语句吗?

    ②:在data步中,我为什么不能用%let 宏语句把变量的值赋值给一个宏变量?

    ③:为什么不能用data步中的if语句去执行%let宏语句呢?

    ④:当我用%if宏语句的时候,为什么数据集中的变量没有值?

    上面的这些问题可以参考下面的这张流程图,下图是SAS代码执行的流程


    image.png

    注意流程图中显示,在SAS代码提交后,SAS首先是判断代码中是否包含宏引用(& or %),如果包含,那么这时候Macro Facility(宏定义工具)就被调用了,之后宏引用被解析,宏语句被执行;

    然后又进入流程判断,只有不包含宏引用的时候,这时候SAS代码才会被编译或者解析,最后执行代码。我觉得这个流程大家要熟记于心。

    看下书中举得一个例子:

    data _null_;
        set sashelp.class(keep=name age where=(name='Jane'));
        %let j_age = age;
    /*  call symputx('j_age',age);*/
    /*  %put &j_age;*/
    run;
    %put &j_age;
    

    上面这段程序输出的结果(不管%put是放在data步里面还是外面),输出的都是下面的结果:


    image.png

    在data步编译的阶段,SAS会自动生成一个存储缓冲区(storage buffer),就是著名的PDV(Program Data Vector),然后data步中变量名字,属性等都会储存在这个PDV中,data执行的时候,变量的值(注意是值,上面是变量本身)也是暂时储存在PDV中,供DATA步骤里的的函数和赋值语句使用。
    但是根据上面的流程图,SAS是先判断你的code中是否存在宏引用,所以SAS在你程序编译之前(换句话说就是在PDV创建之前),就先运行了%let,但是这时候age变量或者age的值都是不存在的,所以用%let并不能生成宏变量。
    我觉得上面的这个流程真的很重要,对于你debug宏程序有很大的帮助。
    虽然%let不能帮你在data步中创建宏变量,但是call symputx能代替%let解决这个问题。需要注意的是,如果你用call symputx创建宏变量,然后在data步中用%put输出宏变量的值,依然是上面的结果(只输出age),但是放在data步外面就能输出宏变量j_age的值(12)。
    所以需要重点记住的一点就是:如果你的程序里面有宏引用,那么这些宏引用会在程序编译之前被解析。

    所以回到最初的那几个问题,答案是不是就一目了然了。记住,不仅是宏引用,任何宏元素可以说在data步存在之前就被执行了,所以有时候并不能直接从PDV中取值。

    那么宏变量和对应的值是储存在哪里呢?一个叫做symbol tables的地方,然后symbol tables又储存在内存中,注意下面讲到的(text value),所以我们可以理解宏变量的值是以文本储存。

    Macro variables and the text values that they hold are stored in symbol tables, which in turn are held in memory. Not only is there a number of ways to create macro variables, but they can also be created in a wide variety of situations.

    说真的,很多东西我也是第一次了解,虽然当初进公司有培训,但都是一些简单的东西,很多东西还是需要你自己的去学习,去结合实际工作中的情况进行理解。所以有翻译不当的地方欢迎指正。

    相关文章

      网友评论

        本文标题:207:macro base(二)

        本文链接:https://www.haomeiwen.com/subject/qafnrdtx.html