SAS-Macro编写调试技巧及相关(Option)

2019-10-21 17:16:55 浏览数 (1)

今天是平安夜,是吧,恩,应该是的,票圈已经被苹果和‘绿色’的圣诞帽霸屏了,小编预祝大家今夜过后“平安喜乐,得偿所愿”。恩,小编最近在研究logistics回归,小编这智商,研究了几天,感觉还没研究入门,所有就先不share那个了,过几天研究入门了在来说那个,今天小编要说的主题是编写Macro时候的调试技巧。

在说正文前,小编还是要插播一下小编今年的一次面试经历。今年,小编去5家公司面试了,恩,从5月份开始,差不多一个月去一家公司面试,前俩家被拒,后三家都拿到offer了。

面了这么多次试,大多数面试都只是谈一下工作“心得”,面试官真正的”SAS技术”的面试也就1家,

把我虐的觉得以前写SAS都写到狗身上了,为啥小编这么觉得呢,因为面试官问了关于Macro调试的几个问题。小编都表述不出来了。虽然最后面试过了也拿到了offer,但是小编还是深刻的认识到自己Macro技能的匮乏,不会那几个option小编都不太好意思说自己会写Macro。

本文由“壹伴编辑器”提供技术支持

1

%goto语句

%goto语句的使用:需要写封闭的Macro代码里面,可以实现语句的跳转

1.且看下方代码,预测一下Log会显示什么?

%macro test;

%put NOTE:开始执行!;

%let flag=1;

%if &flag=1%then%goto exe;

%put NOTE:执行到这儿了~???;

%exe:

%put NOTE:执行结束!;

%mend;

%test

Log:

有没有疑问为什么没有执行Log第53行代码(哦,对了,解释一下为啥我 %put 的时候喜欢加 NOTE:这样的字样,因为加上的的话%put的内容就是绿色的字体了,如果没有NOTE:则是黑色的自己,纯属个人喜好,因为有颜色的字体比较容易引起视觉的关注,也推荐大家写Macro的时候要把一句话%put的Log上的时候加上Note:)。

还是说重点,为啥没有执行53行代码呢,因为有%goto语句,如码所示,在%if语句条件为真的时候则执行了%goto exe(这儿的%if 和条件可以不写, 可以将第50行代码,直接换成 %goto exe;);这个时候SAS会直接跳转到 %exe: 后面,执行后面的代码了。如果我们用%goto语句,会非常方便我们分段调试SAS Macro。它的使用不仅局限在调试的时候使用,在marco中也可以用,但满足一定条件的时候我想直接退出Macro的执行啊,等等。

2

SAS MACRO OPTIONS

调试的option小编还是先用一段代码和一张截图来说明问题。

code:

option mprint symbolgen mlogic mfile;

option notes;

%macro loop(loop);

%do i=1%to &loop. ;

%if &i.=1%then%do;

%put NOTE:圣诞快乐~ (执行第&i.此循环);

%end;

%if &i.=2%then%do;

%put NOTE:圣诞快乐~ (执行第&i.此循环);

%end;

%if &i.=3%then%do;

%put NOTE:圣诞快乐~ (执行第&i.此循环);

%end;

%end;

%mend;

%loop(3);

log:

看日志,有没有发现和大家平时的log不一样,这个日志可以看到很多信息,Macro是怎么运行的,每一步宏变量的值,每一个判断语句是否为成立,等等信息。这些全是通过Option选项实现的。

option mprint symbolgen mlogic mfile;是这四个option,此处主要是(symbolgen mlogic )这俩个Option控制的,如日志,每一句log前独有说明。

这些主要是在调试的时候使用,当Macro调试完成后,我们得关掉这些Option,为啥要关掉了,因为option打开了会严重影响Macro的运行速度。如何关闭Option呢,很简单在每个前面加no就行了。好吧,调试小编暂时用到的也就这些,可能不算很多,也不全,如果各位看客有要补充的可以留言(万谢!),分享使人快乐,千万不要藏着掖着!

本文由“壹伴编辑器”提供技术支持

另外补充一个SAS执行好的Macro文件如何调用:(Macro执行的后的文件是一个黄黄的小文件(sasmacr.sas7bcat))

%let MAC=E:macroother;

libname MAC "&MacPath";

Options MAuto Source MStored SASMStore=MAC;

今天的内容有点少,咦,真的有点少,好吧为了凑字数,小编说点别的,SUM的函数的另类用法。

1

SUM函数常规写法

SUM不就是求和么?是,SUM是求和。先来看常

结果:

在data步中的SUM函数的使用,求多个变量的和针对行(见y变量的生成)。在proc sql中的应用,可以求行之和(见yy变量的生成),也求列的和(见yyy变量的生成)。好吧,这都是常规的用法。

2

SUM非常规写法

SAS中的”布尔类型”:真(1),假(0)

预测一下此时a数据集中Z的值?

在sum函数中写条件,如果满足条件则返回1,不满足则返回0,在实际编程中有什么用途呢,一定用的上,而且针对一些特殊问题,解决起来是非常便捷的。

小编就进举一例:比如,我有20个条件,只要满足其中任意5个,则筛选出来,这个时候就可以用 sum(20个条件)>5 去实现.... 好了,很多函数都有类似这样的功能,大家可以去尝试,我就不一一列举了,其实小编也没有尝试其他函数,因为小编觉得SUM函数现在已经够我解决很多问题了。函数的话,小编以后会继续分享的,因为小编最近在研究自定义函数,等小编学会了,一并给大家分享

0 人点赞