公告

[公告]
2014/01/17
由於已經是faculty的關係,不太有足夠時間寫部落格。因此更新的速度會相當緩慢。再加上近幾年來SAS GLOBAL FORUM沒有出現讓我覺得驚艷的技術文件,所以能分享的文章相對也減少許多。若有人推薦值得分享的SAS技術文件,請利用『問題討論區』告知。

2013/07/19
臉書留言板的功能因為有不明原因故障,因此特此移除。而intensedebate的留言板因管理不易,也一併移除。目前已經開啟內建的 G+ 留言系統,所以請有需要留言的朋友,可直接至『問題討論區』裡面留言。


2009年11月24日 星期二

User-Written DATA Step Functions

原文載點:User-Written DATA Step Functions

這是一個 SAS V9.2 版新釋出的功能,類似 macro,可自行定義 SAS 沒有的函式(function),並可在不用重複呼叫的情況之下,自由使用於每個 data step 裡面。這個自行定義函式的功能,是由 PROC FCMP 來完成。

直接來看一個範例:
proc fcmp outlib=sasuser.funcs.trial;
function study_day(intervention_date, event_date);
if event_date < intervention_date then
return(event_date – intervention_date);
else
return(event_date – intervention_date + 1);
endsub;
run;

options cmplib=sasuser.funcs;
data _null_;
start = '15Feb2006'd;
today = '27Mar2006'd;
sd = study_day(start, today);
put sd=;
run;

這個範例可分為兩部分。第一部份使用 PROC FCMP 去製作一個名叫 study_day 的函式,而裡頭包含了兩個參數,一個叫 intervention _date,另一個叫 event_date。裡面的內容包含了一個 if-else- 的條件判斷式,並依照不同的條件傳回 event_date 減去 intervention_date 的天數或 event_date 減去 intervention_date 加一的天數。結束後使用 endsub 把 function 裡面的內容包起來,並將結果存到 sasuser 底下的 funcs 這個資料裡面,並命名為 trials。

等到要使用時,必須用 options cmplib 把 sasuser.funcs 叫進來,之後便可以無限次的在任何 data step 裡面使用 study_day 這個函式。即便重新開啟 SAS,也不用再跑一次 PROC FCMP 程序,只要執行 options cmplib=sasuser.funcs 這一行後,便可以直接使用 study_day 這個函式了。

如果想要製作 call routine 的函式,則需要在 PROC FCMP 裡面使用 subroutine statement 來製作。範例如下:
proc fcmp outlib=sasuser.funcs.math;
subroutine subA();
x = 5;
call subB();
put 'In subA:' x=;
endsub;
subroutine subB();
x = 'subB';
put 'In subB:' x=;
endsub;
run;

options cmplib=sasuser.funcs;
data _null_;
x = 99;
call subA();
put 'In DATA step: ' x=;
run;

在這個範例中,PROC FCMP 程序先用 subroutine 製作一個叫做 subA() 的 call routine,其功能是會定義 x=5,並且呼叫另一個 call routine 名為 subB(),最後會在 log 視窗列印出「In subA: x=」的字樣。但 subB() 這個 call routine 也是自創的,所以需要用另一個 subroutine statement 把他的功能寫好。完成後兩個 subroutine statement 都要用 endsub 把 subA() 和 subB() 打包好,如此一來,這個自創的 subA() 就可以在第二部份的 data step 裡面使用。

原文裡面還有一些更進階的寫法,但我覺得上面兩個範例已經足夠一般使用者來使用,所以就不花篇幅寫進階的教學了,有興趣的人可以自行下載原文來研究。

CONTACT INFORMATION
Your comments and questions are valued and encouraged. Contact the author:
Jason Secosky
SAS Institute Inc.
SAS Campus Drive
Cary, NC 27513
919-677-8000
Jason.Secosky@sas.com
CODE { display: block; /* fixes a strange ie margin bug */ font-family: Courier New; font-size: 8pt; overflow:auto; background: #f0f0f0 url(http://klcintw.images.googlepages.com/Code_BG.gif) left top repeat-y; border: 1px solid #ccc; padding: 10px 10px 10px 21px; max-height:200px; height:200px; // for IE6 line-height: 1.2em; }