看板 Statistics 關於我們 聯絡資訊
※ 引述《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)
Maninck:感謝<(_ _)> 我來試試看^O^/ 08/01 07:36