全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
6533 16
2013-08-01
原贴:https://bbs.pinggu.org/thread-2377205-1-1.html
写的很精彩,但是试了一下,发现有些出入,可能是我水平有限,请帮助

“如果CALL EXECUTR()的参数中有宏语句,那么宏语句在何时执行会有三种情况:

1.        如果宏语句在双引号中并没有使用%NRSTR(),宏语句会在DATA步编译阶段执行;
2.        如果宏语句在单引号中,或者在双引号中并使用了%NRSTR(),宏语句会在DATA步执行阶段执行;
3.        如果宏语句在单引号中,并且使用了%NRSTR(),则宏语句会在DATA步执行完之后执行。”



下面这段代码如何解释,谢谢:
复制代码

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2013-8-1 16:31:42
楼主的例子中,call execute()中所调用的宏是在编译阶段执行的。宏的执行结果是“proc print data=a;run;”
所以,SAS对这个data步编译完成后就变成:
data a;
        set sashelp.class end=last;
        if _n_=1 then call execute("proc print data=a; run;");
run;

如果在宏定义中加入宏语句的话,那该宏语句也会在编译时执行。例如:
%macro test();
        proc print data=a;
        run;
      %let value=9999;
%mend;


%let value=1111;

data a;
        set sashelp.class end=last;
        if _n_=1 then call execute("%test()");
        value="&value";
run;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2013-8-2 02:55:59
复制代码
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2013-9-11 13:25:42
pobel 发表于 2013-8-1 16:31
楼主的例子中,call execute()中所调用的宏是在编译阶段执行的。宏的执行结果是“proc print data=a;run;” ...
不知道pobel大神有没有用过dosubl 函数
http://support.sas.com/resources ... ings13/032-2013.pdf
1.下面这段代码虽然可以通过,但是我对宏编译,跟data不编译的顺序不太清楚,希望可以得到你的讲解
代码是源于坛里的讨论贴
https://bbs.pinggu.org/thread-2614881-1-1.html
%macro main;
data b;
array a(1000) $ ;
do i=1 to 1000;
a(i)=put(i,pib8.);
end;
e=addrlong(a(1));
call symputx("e",e);
_error_=dosubl( "
data a;
do i=1 to 12;
ans=peeklong(put(input('&e',pib8.)+8*(i-1),pib8.),8);
output;
end;
run;
quit;
");
run;
%mend;

%main;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2013-9-11 14:07:38
zhou.wen 发表于 2013-9-11 13:25
不知道pobel大神有没有用过dosubl 函数
http://support.sas.com/resources/papers/proceedings13/032-20 ...
我没有用过dosubl函数,按照介绍应该是能够实现在执行某个data步的过程中去执行另外一个data步。

在你给出的例子中,dosubl()参数中的ans=peeklong(put(input('&e',pib8.)+8*(i-1),pib8.),8);这一句中的宏变量e能够解析出来么?

(我不是指宏变量引用左右的单引号,而是指上面call symputx()中产生的宏变量e,能够在接下来的dosubl中直接引用?)
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2013-9-11 14:16:04
第一次运行都会报错
第二次运行有的时候成功,有的时候出错,我猜测是sas内部有缓存机制
下面的语句就不会出错
data b;
array a(1000) $ ;
do i=1 to 1000;
a(i)=put(i,pib8.);
end;
e=addrlong(a(1));
call symputx("e",e);
_error_=dosubl( "
data a;
do i=1 to 12;
ans=peeklong(put(input(symget('e'),pib8.)+8*2*(i-1),pib8.),8);
output;
end;
run;
quit;
");
run;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群