美文网首页
268: 宏里面使用in 语句和宏注释

268: 宏里面使用in 语句和宏注释

作者: SASPRO的打工人生活 | 来源:发表于2023-09-08 16:49 被阅读0次

    首先补充一点:

    记得自己在看书的时候,好像是说%if %else 只能用在宏里面,但是昨天有人提醒现在的%if %else可以直接放在开放的代码里,也就是你没必要为了写%if %else 而写一个宏定义,比如下面这样:

    %macro test;
    %if %then %do;
    %else %do;
    %mend;
    %test
    上面这样是没必要的,你可以直接写%if %else,也就是两种方法都可以。这个注意一下就好了.


    image.png

    一:
    不知道大家在开始学习宏的时候,发现在宏里面不能直接用in选项,你得写好几个or选项,比如在data步中我们可以直接写if a in (1:3) ,但是在宏里面你可能就得写上3个,if a=1 or a=2 or a=3;这要是有几十个选项,这不是要一大段or,显然不是很现实。在宏里面,其实也可以用in选项的。

    直接用宏选项:

    %macro inin;
      
      %if aa in aa bb cc dd %then %do;
        %put "this is a test";
      %end;
      %else %put "error,no in options";
    %mend;
    %inin
    
    
    image.png

    但是我们加上这个系统选项之后 minoperator:控制宏处理器是否识别和计算IN(#)逻辑运算符。

    options minoperator;
    %
    macro inin;
      
      %if aa in aa bb cc dd %then %do;
        %put this is a test;
      %end;
      %else %put "error,no in options";
    %mend;
    %inin
    
    image.png

    需要注意列表需要以空格分隔,不能以逗号分隔,但是在DATA步中两种都可以。


    image.png

    但是我们自己可以指定分隔符,通过options mindelimiter=',';
    指定分隔符后,如果你还是用空格的话,就会返回false,也就是跳到%else。
    如果需要恢复空格,直接options mindelimiter='';就可以了。

    同时在宏语言中#就代表in

    %macro inin(var=,list=);
      
      %if %upcase(&var) # %upcase(&list) %then %do;
        %put &=var is in &list;
      %end;
      %else %put error,no in options;
    %mend;
    %inin(var=aa,list=aa bb cc dd);
    
    
    image.png

    二:
    宏注释:

    1. %*; Macro comments 推荐

    %*这是一句注释程序,放在宏里面安全;

    1. /* / style comments 推荐
      /
      这也是一句注释语句,放在宏里面安全/
      3)
      ; asterisk-style comments 不推荐

    这种注释语句放在宏里面不安全,因为可能被识别成宏的一部分;这就让我想起了以前写的一篇文章,用这种注释方法,然后宏一直报错或者运行不出来。

    image.png
    SAS推荐用 /
    /这种注释方法,这种注释会在任何其他类型的注释之前从代码中删除。
    宏注释(%
    ;)和星号风格的注释(* ;)是完整的语句,因此它们是标记化的。这意味着它们不能包含嵌入的分号或不匹配的引号。
    需要注意的是,虽然上面这3种都是注释的方法,但是它们在log里面展示的方法却不一样。在宏定义里面,只有星号风格的注释(* ;)能显示在log(调用mprint的时候)

    在开放式代码的时候,上面这3中注释方法都能显示在log里面。
    下面把上面图片中的注释用Macro comments 和style comments 修改一下,这两种注释方法不会出现问题。

    Macro comments:虽然在SASEG上看只有一段被注释了,但是程序能够正常运行的。

    image.png

    style comments:同时调用mprint;

    image.png image.png

    加上星号注释,只有这种注释能显示在log里面

    image.png image.png

    上面这些就是关于宏注释的一些知识点。

    相关文章

      网友评论

        本文标题:268: 宏里面使用in 语句和宏注释

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