標籤:

為什麼只能到99%?

CRO/Pharm裡面的統計Programmer都會用PROC REPORT產生統計報表,俗稱TLF/TLG。比較常見的做法用RTF作為輸出的介質。這時,programmer往往會在define語句中使用percent作為單位來定義各列的寬度。大部分的programmer都accept這樣一個事實:各列寬度之和最大只能是99%(當然這不是準確的說法,實際上你可以在99%後面適當的小數點,不過大部分的programmer都不會這麼做)。

為什麼呢?為什麼各列寬度之和等於100%時,RTF中table實際上被split了?一個顯而易見的解釋是,邊框需要佔用一定的寬度。這個解釋既對也不對。對的部分是,這個問題確實是因為邊框引起的,但是我們都知道,我們日常輸出的table是俗稱三線表的表格(如下圖),這裡根本沒有左右邊框!

有沒有可能是因為左右邊框是存在的,只是隱藏起來看不見了(比如是無色的?)要嚴肅研究這個問題,先要看一下我們常用的style template是如何定義的。

proc template; n define style TLstyle / store = WORK.TEMPLAT; n parent = styles.rtf; nn class table /n fontweight = light n rules = group n frame = aboven cellpadding = 0n borderspacing = 0 n ; nn style Body from Document / n marginbottom = 1in n margintop = 1in n marginright = 1in n marginleft = 1in n ;t n end; nrun;n

上面是一個常見的style template的定義(的簡化版)。在這個定義中,顯示地和邊框的定義有關的是:

rules = group nframe = aboven

前者規定了table的header和body之間有一個邊框,後者規定了table最上面有一條邊框。因此按照這個定義,table其實是沒有左右邊框的。按照道理,我們應該可以將各列寬度之和定義到100%。但是事實是如果嘗試這樣做,table就斷成了兩截,通常是最後一列被「折」下去了。看上去,儘管沒有左右邊框,SAS在計算寬度時(亦即將define語句中的寬度轉換成TWIPS)仍然考慮了左右邊框的寬度。如果我們嘗試在proc template中suppress所有的邊框:

rules = nonenframe = voidn

或者你也可以直接在proc report裡面這樣做

proc report style(report)=[rules=none frame=void]n

那麼你就可以在proc report中將寬度之和定義到100%而table不被折斷了。但是我們的需求就需要顯式上圖中的那些邊框,怎麼辦?有沒有workaround呢?有。我們稍微修改一下style template的定義:

proc template; n define style TLstyle / store = WORK.TEMPLAT; n parent = styles.rtf; nn class table /n fontweight = light n rules = none n frame = void n cellpadding = 0n borderspacing = 0 n ; nn class header /n borderbottomwidth_=1 n bordertopwidth_=1n ; n n style Body from Document / n marginbottom = 1in n margintop = 1in n marginright = 1in n marginleft = 1in n ;t n end; nrun;n

在上面的定義中,我們將table的邊框定義成完全不顯示,但是在header中顯示上下邊框:

borderbottomwidth_=1 nbordertopwidth_=1n

通過這種定義,可以保證最後顯式的效果和之前定義下是一樣的,而且你可以在define語句中將各列之和定義到100%。

當然,對於實際的應用來說這裡討論的內容基本上沒啥意義,因為通常你不會在意這%1。我倒是見過因為這1%產生的一些顯式上的問題,但是由於要把case講清楚,可能暴露了公司的東西,就不討論了。。。不過其實proc template里的學問還蠻大的,可以認為是SAS Programming領域的前端工作(指的是互聯網領域裡面的前端--網站的前台/表現層部分),有時間可以好好探討一下這裡面的內容。


推薦閱讀:

PaddingRight=
漫談SAS Macro (3) - Macro Quoting, Part I
ORDER=DATA in PROC REPORT
SAS 是一個什麼樣的公司,為什麼常年位於最佳僱主前幾名?
SAS入門指南

TAG:SAS |