→ Maninck:感謝<(_ _)> 我來試試看^O^/ 08/01 07:36
※ 引述《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)