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

2023-09-08  本文已影响0人  SASPRO的打工人生活

首先补充一点:

记得自己在看书的时候,好像是说%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

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

上一篇下一篇

猜你喜欢

热点阅读