美文网首页
SAS 程序冷知识——一个关于%str和%nrstr的案例解读

SAS 程序冷知识——一个关于%str和%nrstr的案例解读

作者: 生物统计与SAS研究员 | 来源:发表于2021-05-05 11:16 被阅读0次

    %macro abc(lb=);

    option mlogic mprint symbolgen;

    proc delete data=_all_;run;

    %mend;

    1、%abc(lb=Ae(mg)|Fe(%)|CLr(mL/hr));

    2、%abc(lb=%str(Ae(mg)|Fe(%)|CLr(mL/hr)));

    3、%abc(lb=%nrstr(Ae(mg)|Fe(%)|CLr(mL/hr)));

    我们先制作如下宏ABC。在执行1的时候,参数lb中含有%,在执行的时候结果为:

    结果可以执行

    看起来%没有对宏的结果造成影响。

    但是如果我们在执行2中,把原来的参数套上%str,结果就无法执行了。

    结果无法执行,SAS的反馈是:提交的代码不完整。

    除非在%号前再加一个%,因为在%str和%nrstr中,%还有一个作用就是:遮蔽该函数无法遮蔽的符号。此处使用的代码如下:%abc(lb=%str(Ae(mg)|Fe(%%)|CLr(mL/hr)));

    可以执行

    如果我们在执行3中,把%str换成%nrstr,看起来可以屏蔽%了,结果却依然没有任何变化。

    %str和%nrstr的结果是一样的

    但是如果我们在执行2中的百分号后随便加个字母,比如字母a,如下:%abc(lb=%str(Ae(mg)|Fe(%a)|CLr(mL/hr)));

    结果可以执行但是,a被当作了宏的名字

    如果我们在执行3中的百分号后随便加个字母,比如字母a,如下:%abc(lb=%nrstr(Ae(mg)|Fe(%a)|CLr(mL/hr)));

    可以执行,也没有被误用的宏

    据此,我们得出结论,%nrstr虽然可以屏蔽%,但是无法屏蔽其作为遮蔽符号的含义,%后面跟随的不是字母,所以即使不加任何函数依然不会被当作宏的触发符号,这也是不加%str和%nrstr函数反而正常的原因。但一旦使用了%str和%nrstr函数,反而使得%具有了遮蔽功能,%后面的“)”就被遮蔽了,从而导致整个代码少了一个结束括号,导致宏程序无法结束。

    所以结论是:%str和%nrstr虽然可以遮蔽一些符号,但是当里面涉及%的时候依然需要小心,%会被当作遮蔽符号的可能。%在函数中具体起到哪种作用关键看符号后跟的符号,如果是可以作为宏名字的符号,那么此处%被当作宏的触发符号,如果是一些特殊符号,则会被当作遮蔽符号。

    以下是本文的后续:SAS 程序冷知识——一个关于%quote和%nrquote还有%bquote的案例解读- 简书

    相关文章

      网友评论

          本文标题:SAS 程序冷知识——一个关于%str和%nrstr的案例解读

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