美文网首页
257:macro base(五)---宏参数

257:macro base(五)---宏参数

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

    宏参数被用来传递传递值或者文本字符串给宏,能让你不用%let就能定义宏变量。

    宏参数有两种类型:一种是positional parameter,另一种是keyword(named) parameter。

    一:位置参数(positional parameter)

    位置参数的名称来源于这样一个事实:即它们是使用%Macro语句上的特定位置来定义的。当调用宏时,该值将通过宏调用中与宏定义中相同的对应位置传递.位置参数比关键词参数有一点点好处,只是少一点点内存。

    %macro look(dsn,obs);
    title "data set &dsn";
    proc contents data=&dsn;
    run;
    title2 "first &obs observations";
    proc print data=&dsn (obs=&obs);
    run;
    %mend look;

    在调用带有参数的宏时,在宏名称后面是一个用逗号分隔的参数值列表,这些参数值由圆括号括起来。

    比如下面这样

    %look(sashelp.cars,10)

    你不必给所有的位置参数一个值,比如下面这样,但是不一定会产生可用的代码
    %look() ---报错
    %look(sashelp.cars) ---报错

    %look(,10)---报错

    比如我们调用这个%look(,10),对于为空的参数,SAS会解析成空字符串(null string),所以%look(,10)会解析成

    title "data set ";
    proc contents data=;
    run;
    title2 "first 10 observations";
    proc print data= (obs=10);
    run;
    这段程序包含语法错误,所以肯定会报错,也不会运行。

    二:关键词参数(keyword parameter)

    关键词参数可以用在任何位置,也可以设置默认的值。形式是有一个等于号。
    %macro look(dsn=,obs=);
    title "data set &dsn";
    proc contents data=&dsn;
    run;
    title2 "first &obs observations";
    proc print data=&dsn (obs=&obs);
    run;
    %mend look;

    %look(obs=10,dsn=sashelp.cars)

    注意到在宏里面是我是把宏参数dsn放在前面,但是调用的时候我给他们换了一下位置,这样是不会报错的,但是还是建议按顺序来。

    如果你需要多次调用一个宏,且某个宏参数的值不变的话,你可以直接在宏里面提前把值写上,比如这样:

    %macro look(dsn=sashelp.cars,obs=);
    title "data set &dsn";
    proc contents data=&dsn;
    run;
    title2 "first &obs observations";
    proc print data=&dsn (obs=&obs);
    run;
    %mend look;

    %look(obs=10)
    %look(obs=15)
    %look(obs=20)
    %look(dsn=sashelp.class,obs=5);/这时候会替换成class数据集/

    需要注意的是,如果你的位置参数和关键词参数用法混用的话,要严格按照所列的顺序赋值,下面这段程序肯定会报错

    %macro look(dsn,obs=);
    title "data set &dsn";
    proc contents data=&dsn;
    run;
    title2 "first &obs observations";
    proc print data=&dsn (obs=&obs);
    run;
    %mend look;

    %look(obs=10,sashelp.cars)

    上面就是关于宏参数需要注意的一些点,当然还有一些好的编程习惯,假设你的宏里面宏参数有很多个:

    1)将横向结构转换成纵向结构
    2)参数能简要描述输入的内容
    3)当多次调用宏都是用默认值的时候,可以把默认值放到宏参数中
    4)对每一个参数最好有对应的注释。

    %look(dsn=,

            var1=Y,
    
            var2=,
    
            var3=N,
    
            obs=,
    
            dsout=);
    

    /******************************************
    dsn:输入数据集

    var1:XXXXXXXXXXX;

    var2:XXXXXXXXXXX;

    var3:XXXXXXXXXXX;

    obs:XXXXXXXXXXX;

    dsout:输出数据集;

    *******************************************/

    相关文章

      网友评论

        本文标题:257:macro base(五)---宏参数

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