作者west1996 (焦了六年变脆了)
看板Statistics
标题Re: [程式] SAS MACTRO 变数的问题
时间Sun Jul 31 22:32:31 2011
※ 引述《Maninck (我是大天才^o^/)》之铭言:
: 标题: [程式] SAS MACTRO 变数的问题
: 时间: Sat Jul 30 14:57:55 2011
:
: [软体程式类别]:
: 入软体程式类别 SAS
:
: [程式问题]:
: 资料处理
:
: [软体熟悉度]:
: 新手(不到1个月)
:
: [问题叙述]:
: 我写了两只程式分别为aa.sas及bb.sas,我想让bb直接呼叫aa的结果存起来。
: 但目前遇到的一个大问题是,他的变数好像都是共用的
: bb里面的变数k,如果宣告成i,他就会跟aa里的i混乱掉,
: 不知道能不能让他们同样都是i,但却不会乱掉。
: 也就是说我想做到像java那样可以模组间的变数不会互相干扰。
:
: [程式范例]:
:
: %MACRO aa (num);
: DATA abc;
: %DO i=1 %TO #
: %DO j =1 %TO #
: col = &i;
: row = &j;
: muti = &i*&j;
: output;
: %END;
: %END;
: RUN;
: %MEND;
:
: %INCLUDE 'E:\TEST\source\aa.sas';
: %MACRO bb (num);
: %DO k=1 %TO #
: %aa(&k);
: DATA tmp&k;
: SET abc;
: RUN;
: %END;
: %MEND;
:
:
:
: -----------------------------------------------------------------------------
:
: --
:
※ 发信站: 批踢踢实业坊(ptt.cc)
: ◆ From: 118.168.95.195
: → ASD332:宣告值域? java是用public or private,SAS> %Global,%Local 07/30 16:08
: → Maninck:耶耶~~写出来了~~感谢^^ 就如你所说的前面加一个宣就好了 07/30 16:32
: → Maninck:另外再请教一个问题,这可以有回传值吗?例:回传一个DATA 07/30 17:37
: → Maninck:在macro bb里面的SET abc 那边我想要做的是接aa组好的DATA 07/30 17:39
: → Maninck:如果不知道aa里面的DATA叫abc,那我bb要怎麽写? 07/30 17:40
: → ASD332:不太懂你说的不知道DATA的名字?就算写方法(or function) 07/31 00:51
: → ASD332:不也需要呼叫你自己定义的名称吗? 07/31 00:51
: ※ 编辑: Maninck 来自: 118.168.90.166 (07/31 09:55)
: → Maninck:我指的是绿色那个档名,因为我现在知道aa里面的Data叫abc 07/31 09:56
: → Maninck:所以我在bb里面就set abc给他,但在不知道aa里面的名称时 07/31 09:57
: → Maninck:我可以用类似DATA tmp&k = &aa(&k);的方式来做吗? 07/31 09:58
: 像我把bb改成下面,他就会出错
: %MACRO bb (num);
: %Local i; /*内部使用宣告*/
: %DO i=1 %TO #
: DATA tmp&i;
: SET %aa(&i );
: %END;
: %MEND;
:
: 错误讯息
: ERROR: File WORK.DATA.DATA does not exist.
: ERROR: File WORK.ABC.DATA does not exist.
: ※ 编辑: Maninck 来自: 118.168.90.166 (07/31 10:04)
: 推 tew:出错是必然的 你在set甚麽样的东西呢? 把%aa带进去 07/31 20:25
: → Maninck:我希望是set macro aa跑出来的data abc,所以才在想macro 07/31 20:39
: → Maninck:aa要怎麽样才可以回传data abc出来? 07/31 20:40
: → Maninck:还是说~~macro无法像java一样可以return一个物件或字串QQ 07/31 20:42
: → Maninck:我在网路上有查到如何回传字串,但就是查不到回传一个data 07/31 20:43
两个方法
1.如果是一个data作出来之後,紧接着就想呼叫这一个data的话,可以使用
&syslast这一
个global等级的automatic macro variable,这个variable会带出程式执行到此最後一
个使用过的data的名称包含他的libname
2.如果不是要马上呼叫的话,aa里面那一个作出来的data的名称either是你本来就给定的
or是根据一个逻辑命名的,所以建议在aa这一支macro里面,先把他的名称储存到一个
global level的macro variable里面,这样就可以在bb里面去呼叫。储存用的方法可能
是用
%let或是用
call symput,depends on 你的data name是不是跟input record有关
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 111.243.21.155
※ 编辑: west1996 来自: 111.243.21.155 (07/31 22:33)
1F:→ Maninck:感谢<(_ _)> 我来试试看^O^/ 08/01 07:36