SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 605|回复: 0
打印 上一主题 下一主题

User-Written DATA Step Functions

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2010-11-4 21:20:54 | 只看该作者

User-Written DATA Step Functions

From LCChien's blog on blogspot

原文載點:<a href="http://docs.google.com/viewer?url=http://www.nesug.org/Proceedings/nesug08/bb/bb13.pdf" target="_blank">User-Written DATA Step Functions</a><br /><br />這是一個 SAS V9.2 版新釋出的功能,類似 macro,可自行定義 SAS 沒有的函式(function),並可在不用重複呼叫的情況之下,自由使用於每個 data step 裡面。這個自行定義函式的功能,是由 PROC FCMP 來完成。<br /><br /><a name='more'></a>直接來看一個範例:<br /><code>proc fcmp outlib=sasuser.funcs.trial;<br />function study_day(intervention_date, event_date);<br />if event_date &lt; intervention_date then<br />return(event_date – intervention_date);<br />else<br />return(event_date – intervention_date + 1);<br />endsub;<br />run;<br /><br />options cmplib=sasuser.funcs;<br />data _null_;<br />start = '15Feb2006'd;<br />today = '27Mar2006'd;<br />sd = study_day(start, today);<br />put sd=;<br />run;</code><br />這個範例可分為兩部分。第一部份使用 PROC FCMP 去製作一個名叫 study_day 的函式,而裡頭包含了兩個參數,一個叫 intervention _date,另一個叫 event_date。裡面的內容包含了一個 if-else- 的條件判斷式,並依照不同的條件傳回 event_date 減去 intervention_date 的天數或 event_date 減去 intervention_date 加一的天數。結束後使用 endsub 把 function 裡面的內容包起來,並將結果存到 sasuser 底下的 funcs 這個資料裡面,並命名為 trials。<br /><br />等到要使用時,必須用 options cmplib 把 sasuser.funcs 叫進來,之後便可以無限次的在任何 data step 裡面使用 study_day 這個函式。即便重新開啟 SAS,也不用再跑一次 PROC FCMP 程序,只要執行 options cmplib=sasuser.funcs 這一行後,便可以直接使用 study_day 這個函式了。<br /><br />如果想要製作 call routine 的函式,則需要在 PROC FCMP 裡面使用 subroutine statement 來製作。範例如下:<br /><code>proc fcmp outlib=sasuser.funcs.math;<br />subroutine subA();<br />x = 5;<br />call subB();<br />put 'In subA:' x=;<br />endsub;<br />subroutine subB();<br />x = 'subB';<br />put 'In subB:' x=;<br />endsub;<br />run;<br /><br />options cmplib=sasuser.funcs;<br />data _null_;<br />x = 99;<br />call subA();<br />put 'In DATA step: ' x=;<br />run;</code><br />在這個範例中,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 裡面使用。<br /><br />原文裡面還有一些更進階的寫法,但我覺得上面兩個範例已經足夠一般使用者來使用,所以就不花篇幅寫進階的教學了,有興趣的人可以自行下載原文來研究。<br /><br /><span style="font-size: large;"><b>CONTACT INFORMATION</b></span><br />Your comments and questions are valued and encouraged. Contact the author:<br />Jason Secosky<br />SAS Institute Inc.<br />SAS Campus Drive<br />Cary, NC 27513<br />919-677-8000<br /><!-- e --><a href="mailto:Jason.Secosky@sas.com">Jason.Secosky@sas.com</a><!-- e --><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6268919072942670865-6068546477592325753?l=sugiclub.blogspot.com' alt='' /></div>
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-2-3 18:26 , Processed in 0.072494 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表