Report Writing InterfaceによるHTML形式
レポート作成の検討
望戸 遼
(イーピーエス株式会社)
Output HTML Report by
Report Writing Interface
Mouko Ryo
要旨:
SAS9.4よりOutput Derivery System(以下ODS)に追加されたReport
Writing Interface(以下RWI)を使用して、HTML形式のレポート作成
の実用性と可能性について検討する。
なお、HTML出力には、タグの綺麗さからODS HTML5ステートメント
を使用する。
3
1. Report Writing Interface(RWI)とは?
2. RWIの使い方
3. RWIでHTMLを出力(要約統計量)
4. RWIでHTMLを出力(グラフ)
5. RWIでHTMLを出力(一覧表)
6. まとめ
7. おまけ:HTMLであることを利用して
1. Report Writing Interface(RWI)とは?
2. RWIの使い方
3. RWIでHTMLを出力(要約統計量)
4. RWIでHTMLを出力(グラフ)
5. RWIでHTMLを出力(一覧表)
6. まとめ
7. おまけ:HTMLであることを利用して
5
Report Writing Interface(RWI)とは?
SAS9.4より追加されたOutput Derivery System(ODS)の機能
プロシジャではなく、Dataステップからレポートを出力する
data xxxxx; ...;
run;
1. Report Writing Interface(RWI)とは?
Treatment Visit N Mean ...
xxxxx xxxx 99 99
xxxx 99 99
1. Report Writing Interface(RWI)とは?
2. RWIの使い方
3. RWIでHTMLを出力(要約統計量)
4. RWIでHTMLを出力(グラフ)
5. RWIでHTMLを出力(一覧表)
6. まとめ
7. おまけ:HTMLであることを利用して
7
step 1. RWIのODSオブジェクトを定義
step 2. テーブルを開始
step 3. 行を開始
step 4. セル(≒列)を出力
step 5. 行を終了
step 6. テーブルを終了
RWIのODSオブジェクトと、オブジェクトメソッドを駆使してテーブルを出力(表現)していく。 メソッドは以下のように記載する(オプションが不要なメソッドも存在する)。 オブジェクト名.メソッド(オプション1, オプション2,...)2. RWIの使い方
本発表で使用するメソッド一覧
2. RWIの使い方
table_start table_end head_start head_end body_start body_end foot_start foot_end row_start row_end cell_start cell_end format_cell image9
それぞれのメソッドで使用するオプション
2. RWIの使い方
メソッド オプション 詳細
format_cell data* セルに出力する文字列、または変数を指定する。sas関数を使
用することも可能。
style_attr Style Attributeを指定する。
column_span 結合列数を指定する。数値変数を用いて指定することも可能。 row_span 結合行数を指定する。数値変数を用いて指定することも可能。 just 出力文字列の横配置を設定する。大文字小文字どちらでも OK。 "C":中央揃え(デフォルト) "R":右揃え "L":左揃え split 指定した文字を改行として扱う。 image file* 指定した画像ファイルを貼り付ける。 *:メソッド必須のオプション
data _null_;
set sashelp.class end=end; if _n_=1 then do; dcl odsout r(); /*...step 1.*/ r.table_start(); /*...step 2.*/ end; r.row_start(); /*...step 3.*/ r.format_cell(data:name); /*...step 4.*/ r.format_cell(data:sex); r.format_cell(data:age); r.format_cell(data:height); r.format_cell(data:weight); r.row_end(); /*...step 5.*/ if end then do;
r.table_end(); /*...step 6.*/ end; run;
2. RWIの使い方
sashelp.classデータセットをRWIで出力する。 ODSオブジェクトを宣言して、 (if _n_=1 thenにてobsが読込ま れるごとに宣言されることを回避)11
data _null_;
set sashelp.class end=end; if _n_=1 then do; dcl odsout r(); /*...step 1.*/ r.table_start(); /*...step 2.*/ end; r.row_start(); /*...step 3.*/ r.format_cell(data:name); /*...step 4.*/ r.format_cell(data:sex); r.format_cell(data:age); r.format_cell(data:height); r.format_cell(data:weight); r.row_end(); /*...step 5.*/ if end then do;
r.table_end(); /*...step 6.*/ end; run;
2. RWIの使い方
sashelp.classデータセットをRWIで出力する。 table_startメソッドを実行、 (if _n_=1 thenにてobsが読込ま れるごとにテーブルが開始しない よう回避)data _null_;
set sashelp.class end=end; if _n_=1 then do; dcl odsout r(); /*...step 1.*/ r.table_start(); /*...step 2.*/ end; r.row_start(); /*...step 3.*/ r.format_cell(data:name); /*...step 4.*/ r.format_cell(data:sex); r.format_cell(data:age); r.format_cell(data:height); r.format_cell(data:weight); r.row_end(); /*...step 5.*/ if end then do;
r.table_end(); /*...step 6.*/ end; run;
2. RWIの使い方
sashelp.classデータセットをRWIで出力する。 row_startメソッドを実行して行を 開始して、 (obs毎に出力したいのでここはif _n_=1 thenのくくりには入れな い)13
data _null_;
set sashelp.class end=end; if _n_=1 then do; dcl odsout r(); /*...step 1.*/ r.table_start(); /*...step 2.*/ end; r.row_start(); /*...step 3.*/ r.format_cell(data:name); /*...step 4.*/ r.format_cell(data:sex); r.format_cell(data:age); r.format_cell(data:height); r.format_cell(data:weight); r.row_end(); /*...step 5.*/ if end then do;
r.table_end(); /*...step 6.*/ end; run;
2. RWIの使い方
sashelp.classデータセットをRWIで出力する。 format_cellメソッドを実行して変 数の内容をセルへ出力、 (obs毎に出力したいのでここはif _n_=1 thenのくくりには入れな い)data _null_;
set sashelp.class end=end; if _n_=1 then do; dcl odsout r(); /*...step 1.*/ r.table_start(); /*...step 2.*/ end; r.row_start(); /*...step 3.*/ r.format_cell(data:name); /*...step 4.*/ r.format_cell(data:sex); r.format_cell(data:age); r.format_cell(data:height); r.format_cell(data:weight); r.row_end(); /*...step 5.*/
if end then do;
r.table_end(); /*...step 6.*/ end; run;
2. RWIの使い方
sashelp.classデータセットをRWIで出力する。 row_endメソッドを実行して行を 終了させ、 (obs毎に行を終了したいのでここ はif _n_=1 thenのくくりには入れ ない)15
data _null_;
set sashelp.class end=end; if _n_=1 then do; dcl odsout r(); /*...step 1.*/ r.table_start(); /*...step 2.*/ end; r.row_start(); /*...step 3.*/ r.format_cell(data:name); /*...step 4.*/ r.format_cell(data:sex); r.format_cell(data:age); r.format_cell(data:height); r.format_cell(data:weight); r.row_end(); /*...step 5.*/ if end then do;
r.table_end(); /*...step 6.*/ end; run;
2. RWIの使い方
sashelp.classデータセットをRWIで出力する。 table_endメソッドを実行してテー ブルを終了する。 (最後に一度だけでよいので、set ステートメントendオプションより設 定した参照よりif文でくくる)data _null_;
set sashelp.class end=end; if _n_=1 then do; dcl odsout r(); /*...step 1.*/ r.table_start(); /*...step 2.*/ end; r.row_start(); /*...step 3.*/ r.format_cell(data:name); /*...step 4.*/ r.format_cell(data:sex); r.format_cell(data:age); r.format_cell(data:height); r.format_cell(data:weight); r.row_end(); /*...step 5.*/ if end then do;
r.table_end(); /*...step 6.*/ end;
run;
2. RWIの使い方
17 data _null_; dcl odsout r(); r.table_start(); r.row_start(); r.cell_start(); r.table_start(); r.row_start(); r.format_cell(data:"col1 cell1"); r.format_cell(data:"col1 cell2"); r.row_end(); r.table_end(); r.cell_end(); r.cell_start(); r.table_start(); r.row_start(); r.format_cell(data:"col2 cell1"); r.format_cell(data:"col2 cell2"); r.row_end(); r.table_end(); r.cell_end(); r.row_end(); r.table_end(); run; テーブルを入れ子にすることも可能
2. RWIの使い方
テーブルを入れ子にすることも可能 data _null_; dcl odsout r(); r.table_start(); r.row_start(); r.table_start(); r.row_start(); r.format_cell(data:"row1 cell1"); r.format_cell(data:"row1 cell2"); r.row_end(); r.table_end(); r.row_end(); r.row_start(); r.table_start(); r.row_start(); r.format_cell(data:"row2 cell1"); r.format_cell(data:"row2 cell2"); r.row_end(); r.table_end(); r.row_end(); r.table_end(); run;
2. RWIの使い方
19
1. Report Writing Interface(RWI)とは?
2. RWIの使い方
3. RWIでHTMLを出力(要約統計量)
4. RWIでHTMLを出力(グラフ)
5. RWIでHTMLを出力(一覧表)
6. まとめ
7. おまけ:HTMLであることを利用して
3. RWIでHTMLを出力(要約統計量)
parameter treatment timing
n mean std min median max n mean std min median max xxxxx xxxxx xxxxx 999 999 999 999 999 999 xxxxx 999 999 999 999 999 999 999 999 999 999 999 999 xxxxx 999 999 999 999 999 999 999 999 999 999 999 999 xxxxx xxxxx 999 999 999 999 999 999 ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... table_1 要約統計量 full analysis set
value change value
21
出力したいsasデータセットtable_1
レポートの列数、行数に着目すると、table_1は16列×n行のテーブル
行数は、parameter、treatment、timingの数に依存するが、結局は繰り返しの数が増減するだけ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
1 table_1 要約統計量 2 full analysis set
3 parameter treatment timing value change value
4 n mean std min median max n mean std min median max
5 xxxxx xxxxx xxxxx 999 999 999 999 999 999 6 xxxxx 999 999 999 999 999 999 999 999 999 999 999 999 7 xxxxx 999 999 999 999 999 999 999 999 999 999 999 999 8 xxxxx xxxxx 999 999 999 999 999 999 ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
3. RWIでHTMLを出力(要約統計量)
23
テーブルの要素について着目すると、集計する値に関係無く一定の「Head」 集計する値によって変化する「Body」
parameter treatment timing
n mean std min median max n mean std min median max xxxxx xxxxx xxxxx 999 999 999 999 999 999 xxxxx 999 999 999 999 999 999 999 999 999 999 999 999 xxxxx 999 999 999 999 999 999 999 999 999 999 999 999 xxxxx xxxxx 999 999 999 999 999 999 ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... : Head : Body change value value table_1 要約統計量 full analysis set
結合セルに着目すると、Headに7箇所、Bodyにparameter、treatmentの数だけセルの結合がある
n mean std min median max n mean std min median max xxxxx 999 999 999 999 999 999 xxxxx 999 999 999 999 999 999 999 999 999 999 999 999 xxxxx 999 999 999 999 999 999 999 999 999 999 999 999 xxxxx xxxxx 999 999 999 999 999 999 ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... : セルの結合 xxxxx xxxxx table_1 要約統計量 full analysis set
parameter treatment timing value change value
25 文字フォントの設定はテンプレートを作成。 半角文字はTimesNewRomanを、全角文字 はMSゴシックをあてて、文字サイズは10pt、 太字とか斜体はあてない。 罫線の設定はStyleAttributeを使用する。 毎回書くと冗長なのでマクロ変数に設定。 (黒色、実線、1ptの下線) proc template;
define style onlyfontstyle; class Container /
fontfamily="'Times New Roman','MS Gothic'" fontsize=10pt fontweight=medium ; end; run; %let bb=borderbottomcolor=black borderbottomstyle=solid borderbottomwidth=1px;
3. RWIでHTMLを出力(要約統計量)
ODSステートメントstyleオプションにて先ほどの
styleを当てる。
head_start、head_end、body_start、body_end メソッドは出力に必須ではないが、HTMLファイルと してタグが整い、またプログラムのコーディングとして もヘッダーとデータ出力部分の差が見えやすいので おすすめ
ods html5 file="./table_1.html" style=onlyfontstyle; data _null_;
set table_1 end=end; by sort1 sort2 sort3; if _n_=1 then do; dcl odsout r(); r.table_start(); r.head_start(); ~~~~~~~~~~~~~~~~ r.head_end(); r.body_start(); end; ~~~~~~~~~~~~~~~~ if end then do;
r.body_end(); r.table_end(); end;
run;
27 ~~~~~~~~~~~~~~~~ r.head_start(); r.row_start(); r.format_cell(data:"table_1 要約統計量", just:"l", column_span:16); r.row_end(); r.row_start();
r.format_cell(data:"full analysis set",
just:"l", column_span:16, style_attr:"&bb."); r.row_end();
r.row_start();
r.format_cell(data:"parameter", row_span:2, style_attr:"&bb."); ~~~~~~~~~~~~~~~~
r.row_end(); r.row_start(); do i=1 to 2;
r.format_cell(data:"n", just:"r", style_attr:"&bb."); ~~~~~~~~~~~~~~~~
r.format_cell(data:"max", just:"r", style_attr:"&bb."); if i=1 then r.format_cell(data:"", style_attr:"&bb."); end; r.row_end(); ~~~~~~~~~~~~~~~~ r.head_end(); ~~~~~~~~~~~~~~~~ justオプションで文字の左右位置を 設定
3. RWIでHTMLを出力(要約統計量)
メソッド オプション 詳細 format_cell just 出力文字列の横配置を設定する。 大文字小文字どちらでもOK。 "C":中央揃え(デフォルト) "R":右揃え "L":左揃え~~~~~~~~~~~~~~~~ r.head_start(); r.row_start(); r.format_cell(data:"table_1 要約統計量", just:"l", column_span:16); r.row_end(); r.row_start();
r.format_cell(data:"full analysis set",
just:"l", column_span:16, style_attr:"&bb."); r.row_end();
r.row_start();
r.format_cell(data:"parameter", row_span:2, style_attr:"&bb."); ~~~~~~~~~~~~~~~~
r.row_end(); r.row_start(); do i=1 to 2;
r.format_cell(data:"n", just:"r", style_attr:"&bb."); ~~~~~~~~~~~~~~~~
r.format_cell(data:"max", just:"r", style_attr:"&bb."); if i=1 then r.format_cell(data:"", style_attr:"&bb."); end; r.row_end(); ~~~~~~~~~~~~~~~~ r.head_end(); column_span、row_spanオプショ ンで何列・何行結合するか設定
3. RWIでHTMLを出力(要約統計量)
29 ~~~~~~~~~~~~~~~~ r.head_start(); r.row_start(); r.format_cell(data:"table_1 要約統計量", just:"l", column_span:16); r.row_end(); r.row_start();
r.format_cell(data:"full analysis set",
just:"l", column_span:16, style_attr:"&bb."); r.row_end();
r.row_start();
r.format_cell(data:"parameter", row_span:2, style_attr:"&bb."); ~~~~~~~~~~~~~~~~
r.row_end(); r.row_start(); do i=1 to 2;
r.format_cell(data:"n", just:"r", style_attr:"&bb."); ~~~~~~~~~~~~~~~~
r.format_cell(data:"max", just:"r", style_attr:"&bb."); if i=1 then r.format_cell(data:"", style_attr:"&bb."); end; r.row_end(); ~~~~~~~~~~~~~~~~ r.head_end(); ~~~~~~~~~~~~~~~~ style_attrオプションでStyleAttribute を設定する(下罫線を挿入) %let bb=borderbottomcolor=black borderbottomstyle=solid borderbottomwidth=1px;
3. RWIでHTMLを出力(要約統計量)
~~~~~~~~~~~~~~~~ r.head_start(); r.row_start(); r.format_cell(data:"table_1 要約統計量", just:"l", column_span:16); r.row_end(); r.row_start();
r.format_cell(data:"full analysis set",
just:"l", column_span:16, style_attr:"&bb."); r.row_end();
r.row_start();
r.format_cell(data:"parameter", row_span:2, style_attr:"&bb."); ~~~~~~~~~~~~~~~~
r.row_end(); r.row_start();
do i=1 to 2;
r.format_cell(data:"n", just:"r", style_attr:"&bb."); ~~~~~~~~~~~~~~~~
r.format_cell(data:"max", just:"r", style_attr:"&bb."); if i=1 then r.format_cell(data:"", style_attr:"&bb.");
end; r.row_end(); ~~~~~~~~~~~~~~~~ r.head_end(); 同じ出力をするのであればdataス テップのdoループを利用できる
3. RWIでHTMLを出力(要約統計量)
31 data _null_;
set table_1 end=end; by sort1 sort2 sort3;
~~~~~~~~~~~~~~~~ r.body_start();
~~~~~~~~~~~~~~~~ dmy="";
array outs{*} out1-out9 dmy out10-out15;
r.row_start();
do i=1 to dim(outs); if i in(1,2) then do;
if i=1 then span=9; if i=2 then span=3; if outs[i]^="" then
r.format_cell(data:strip(outs[i]), row_span:span, style_attr:"&bb."); end;
else do;
if i=3 then do;
if last. sort2 then r.format_cell(data:strip(outs[i]), style_attr:"&bb."); else r.format_cell(data:strip(outs[i]));
end;
~~~~~~~~~~~~~~~~ end;
end;
r.row_end(); if end then do;
r.body_end(); ~~~~~~~~~~~~~~~~ arrayステートメントで変数をまとめてRWI処理 に落とし込むことが可能(文字変数を指定すると 余った変数長分半角スペースが入るのでstrip関数で 除いている)
3. RWIでHTMLを出力(要約統計量)
column_span、row_spanオプションを変数 で指定することも可能
3. RWIでHTMLを出力(要約統計量)
data _null_;
set table_1 end=end; by sort1 sort2 sort3;
~~~~~~~~~~~~~~~~ r.body_start();
~~~~~~~~~~~~~~~~ dmy="";
array outs{*} out1-out9 dmy out10-out15; r.row_start();
do i=1 to dim(outs); if i in(1,2) then do;
if i=1 then span=9; if i=2 then span=3; if outs[i]^="" then
r.format_cell(data:strip(outs[i]), row_span:span, style_attr:"&bb."); end;
else do;
if i=3 then do;
if last. sort2 then r.format_cell(data:strip(outs[i]), style_attr:"&bb."); else r.format_cell(data:strip(outs[i])); end; ~~~~~~~~~~~~~~~~ end; end; r.row_end(); if end then do;
33
下罫線を引くobsの特定にbyステートメントで のlastオプションを利用する
3. RWIでHTMLを出力(要約統計量)
data _null_;
set table_1 end=end;
by sort1 sort2 sort3;
~~~~~~~~~~~~~~~~ r.body_start();
~~~~~~~~~~~~~~~~ dmy="";
array outs{*} out1-out9 dmy out10-out15; r.row_start();
do i=1 to dim(outs); if i in(1,2) then do;
if i=1 then span=9; if i=2 then span=3; if outs[i]^="" then
r.format_cell(data:strip(outs[i]), row_span:span, style_attr:"&bb."); end;
else do;
if i=3 then do;
if last. sort2 then r.format_cell(data:strip(outs[i]), style_attr:"&bb."); else r.format_cell(data:strip(outs[i])); end; ~~~~~~~~~~~~~~~~ end; end; r.row_end(); if end then do;
r.body_end();
35
3. RWIでHTMLを出力(要約統計量)
1. Report Writing Interface(RWI)とは?
2. RWIの使い方
3. RWIでHTMLを出力(要約統計量)
4. RWIでHTMLを出力(グラフ)
5. RWIでHTMLを出力(一覧表)
6. まとめ
7. おまけ:HTMLであることを利用して
37
table_2のような、2パラメータ(systolic blood pressure, diastolic bloodpressure)、 3群それぞれのグラフを出力するレポートを考えていく
table_2 スパゲッティプロット full analysis set
3列2行で各群各項目ごとにグラフを出力したいが、例えばGREPRAYプロシジャやGTLの各 種レイアウトを使用し1ファイルとして出力することも可能であるが、HTMLファイルであれば1 セルに1グラフを埋め込むことが可能なので、本稿では3列2行のセルに1つずつグラフを埋め 込んでいく
table_2 スパゲッティプロット full analysis set
39
3列4行の固定テーブルであるので、sasデータセットを使用せずとも、table_2は出力可能である (もちろんsasデータセットを使用した出力も可能である)
table_2 スパゲッティプロット full analysis set
1パラメータ1群ごとのグラフファイル(table_21.png~table_26.png)を用意
41
ods html5 file="./table_2.html" style=onlyfontstyle; data _null_; dcl odsout r(); r.table_start(); r.head_start(); ~~~~~~~~~~~~~~~~ r.head_end(); r.body_start(); do p=1 to 2; r.row_start(); do a=1 to 3; r.cell_start(); r.image(file:cats("table_2",(p-1)*3+a,".png")); r.cell_end(); end; r.row_end(); end; r.body_end(); r.table_end(); run; ods html5 close; 2行出力するためのdoループと3列出 力するためのdoループを入れ子にして 効率よくコーディングする imageメソッドで画像ファイルを各セル へ挿入する imageメソッドのfileオプションに指定し たファイル名が<img>タグのsrc属性と なる "table_21.png" "table_22.png" "table_23.png" "table_24.png" "table_25.png" "table_26.png"
4. RWIでHTMLを出力(グラフ)
ods html5 file="./table_2.html" style=onlyfontstyle; data _null_; dcl odsout r(); r.table_start(); r.head_start(); ~~~~~~~~~~~~~~~~ r.head_end(); r.body_start(); do p=1 to 2; r.row_start(); do a=1 to 3; r.cell_start(); r.image(file:cats("table_2",(p-1)*3+a,".png")); r.cell_end(); end; r.row_end(); end; r.body_end(); r.table_end(); run; ods html5 close; 画像ファイル名"だけ"を指定しているた め、ここで出力されるHTMLファイルと 同じディレクトリに存在する table_21.png~table_26.pngを表示す ることになり、つまり相対パスで記載し ていることになる 画像ファイルが必ず1箇所のディレクトリ に存在する状況であれば、絶対パスで 記載してもよいかも "table_21.png" "table_22.png" "table_23.png" "table_24.png" "table_25.png" "table_26.png"
4. RWIでHTMLを出力(グラフ)
43
4. RWIでHTMLを出力(グラフ)
45
1. Report Writing Interface(RWI)とは?
2. RWIの使い方
3. RWIでHTMLを出力(要約統計量)
4. RWIでHTMLを出力(グラフ)
5. RWIでHTMLを出力(一覧表)
6. まとめ
7. おまけ:HTMLであることを利用して
最後に以下、table_3のような一覧表を出力するレポートを考えていく
treatment subject parameter timing value change from baseline xxxx xxxx xxxx xxxx 99.9* xxxx 99.9 99.9 xxxx 99.9 99.9 xxxx xxxx 99.9* xxxx 99.9 99.9 xxxx 99.9 99.9 ... ... ... ... ... ... *:baseline value. full analysis set table_3 一覧表
47
出力したいsasデータセットtable_3
data _null_;
set table_3 end=end;
by armn subjid paramn visitnum; if _n_=1 then do; dcl odsout r(); r.table_start(); r.head_start(); r.row_start(); ~~~~~~~~~~~~~~~~ r.row_end(); r.row_start(); ~~~~~~~~~~~~~~~~
r.format_cell(data:"change|from|baseline", style_attr:"&bb.", split:"|", just:"r"); r.row_end(); r.head_end(); r.body_start(); end; ~~~~~~~~~~~~~~~~ splitオプションで、指定した文字を改行とし て扱うことが出来きる HTMLファイルとしては<br/>タグとして出力 される
5. RWIでHTMLを出力(一覧表)
49
~~~~~~~~~~~~~~~~ r.row_start();
array outs{*} out1-out6; array spans{*} span1-span3; do i=1 to dim(outs);
if last. paramn then classstr=cats("class='",scan(outs[i],1,":"),"'")||" &bb."; else classstr=cats("class='",scan(outs[i],1,":"),"'");
if i in(5,6) then juststr="r"; else if i=3 then juststr="l"; else juststr="";
if i in(1,2,3) then do;
if scan(outs[i],2,":")^="" then
r.format_cell(data:strip(scan(outs[i],2,":")), row_span:spans[i],
style_attr:strip(classstr)||" &bb."); end; else do; r.format_cell(data:strip(scan(outs[i],2,":")), style_attr:strip(classstr), just:juststr); end; end; r.row_end(); ~~~~~~~~~~~~~~~~ style_attrオプションに設定しているclassstr変数 の中身、「class='xxxxx'」はStyleAttributeであり、 HTMLファイルとして該当セル(又は行や、bodyそ のもの)へメタデータを埋め込むことが可能 HTMLファイルにはclass属性に設定した文字列 ('xxxxx')が追加される 「class='subjid'」、「class='aval'」、 「class='subjid' borderbottomcolor=black」...
5. RWIでHTMLを出力(一覧表)
~~~~~~~~~~~~~~~~ if end then do;
r.body_end();
r.foot_start();
r.row_start();
r.format_cell(data:"*:baseline value.", column_span:6, just:"l"); r.row_end(); r.foot_end(); r.table_end(); end; run; ~~~~~~~~~~~~~~~~ foot_start、foot_endメソッドは出力に必須ではないが、HTMLファ イルとしてタグが整い、またプログラムのコーディングとしてもフッ ターが見えやすいのでおすすめ
5. RWIでHTMLを出力(一覧表)
51 ods escapechar="~"; out5変数内に「~{super *}」と格納された箇所では、 エスケープ文字と「super」インラインフォーマット関 数を用いて「*」を上付きにして出力している。HTML ファイルとしては<sup>*</sup>となる。
5. RWIでHTMLを出力(一覧表)
53
5. RWIでHTMLを出力(一覧表)
1. Report Writing Interface(RWI)とは?
2. RWIの使い方
3. RWIでHTMLを出力(要約統計量)
4. RWIでHTMLを出力(グラフ)
5. RWIでHTMLを出力(一覧表)
6. まとめ
7. おまけ:HTMLであることを利用して
55 RWIと既存のプロシジャのメリット・デメリット
6. まとめ
RWI
既存のプロシジャ
出力の柔軟性 ◎ dataステップを利用するため、基本 的にほとんどの形のテーブルを網羅 でき、sas関数を利用しつつ出力が 可能。 △ プロシジャの機能に制限されるため、 限界がある。 プログラムの可読性 △ sasオブジェクト形式の記載となるた め、慣れが必要かもしれない。また、 目的の出力とするためにコーディン グ量が多くなる傾向がある。しかし、 dataステップを利用するのでアルゴ リズムは理解し易い。 ○ プロシジャの記載ルールに則ればよ いので、基本的には容易。 RTFファイルへの出力 × 出力は出来るが、サポートされてい ない。使えないメソッドも存在する。 ○ サポートされているため出力可能。6. まとめ
HTML形式ではあるがこれまでの出力結果から、RWIを利用した出力 と既存のプロシジャを利用した出力とほとんど変わらない出力が可能 であることを示せた。 プロシジャでは難しかったデータの加工をしつつ出力をするという点は 非常に意義のあることと考える。 RWIはRTFファイルへの出力がサポートされていないため、実務上で はすぐに活躍することは無いのかもしれない。今後、RTFファイルへの 出力がサポートされれば既存のプロシジャでの出力に取って代わるか もしれない。57
1. Report Writing Interface(RWI)とは?
2. RWIの使い方
3. RWIでHTMLを出力(要約統計量)
4. RWIでHTMLを出力(グラフ)
5. RWIでHTMLを出力(一覧表)
6. まとめ
7. おまけ:HTMLであることを利用して
7. おまけ:HTMLであることを利用して
59
7. おまけ:HTMLであることを利用して
7. おまけ:HTMLであることを利用して
新たにHTMLファイルへ出力すことにより、一つ のHTMLファイルへ統合することが可能
61
7. おまけ:HTMLであることを利用して
まとめる際にリンクを埋め込めば目的のレポートまでクリックで画面移動で きるし、インデックスのようなテーブルと実際のレポートとをブラウザ上で2画
63
参考文献
65