zoukankan      html  css  js  c++  java
  • 关于sas宏的一点想法

    有人说把sas宏比作其他语言的函数,但是我做此类比的时候陷入了死胡同,没有成功,举一例,如果是函数就要有返回值,sas宏的返回又是什么。而且sas宏涉及到编译阶段,导致很难理解。

    直到看到了一个人说,宏是帮你写程序的程序,才有那么点感觉。

    如果真的是这样,我们的程序其实就是一段文本,传给后台,然后运行。类似于在sql中我们是用execute函数来执行一段被引号括起来的sql语句。

    所以我们是否可以把宏当做文本编辑语言,或者最直接的就是一个字符串编辑语言,编辑生成一个字符串,然后将字符串提交给后台进行运行。

    举个例子:


    %let x=%str(data a;set sashelp.class;run;);
    %PUT &x.;
    &x.;

    这段代码可以直接运行,而且生成了数据集A,那么这里的宏变量x其实就是一段可执行的sas代码,使用%str()是为了以防sas解析时认为;是句子的分隔符。

    再看下一段代码:

    %let x=%str(data r;);
    %let y=%str(set sashelp.class;);
    %let z=%str(run;);
    %let s=&x.&y.&z.;
    &s.;

    这个的字符串拼接其实就非常明显了。

    错误:ERROR: Open code statement recursion detected.

    解决方法:单独执行run; quit;等即可。

    一个新的更改数据集变量顺序的方法,其中心思路也是拼接程序:

    varnum是变量顺序。

    data a;
    input name $ id sex $ num1 var1 $ num2 var2 $ var3 var4 $;
    cards;
    a 1 m 3 x 5 y 7 z
    ;
    run;
    proc print;
    run;


    proc sql;
    create table vars as
    select varnum,name
    from dictionary.columns
    where memname='A';
    quit;

    data vars;
    set vars;
    if name='num2' then varnum=4.1;
    run;

    proc sql ;
    select name into :a_vars separated by' '
    from vars 
    order by varnum;
    quit;

    %put &a_vars.;
    data a;
    retain &a_vars.;
    set a;
    run;
    proc print ;
    run;

    宏拼接字符串的难点在于单引号双引号%&等特殊符号在何时应该被解析,我们提交给sas后台的代码不像其他语言那样是带有双引号或者单引号的!

    今天先写到这里,后面我会进行更多的试验,把这方面的内容从理论和实际方面补齐。

  • 相关阅读:
    优先队列
    Problem W UVA 662 二十三 Fast Food
    UVA 607 二十二 Scheduling Lectures
    UVA 590 二十一 Always on the run
    UVA 442 二十 Matrix Chain Multiplication
    UVA 437 十九 The Tower of Babylon
    UVA 10254 十八 The Priest Mathematician
    UVA 10453 十七 Make Palindrome
    UVA 10163 十六 Storage Keepers
    UVA 1252 十五 Twenty Questions
  • 原文地址:https://www.cnblogs.com/SSSR/p/6905834.html
Copyright © 2011-2022 走看看