勉強するよって話をよく聞きます。
医薬系の解析帳票についてRWIがProc Report等と比べて、第一選択になりえる
機能を持っているということはSASNAMIさんが解説されてます
「Report Writing Interface (RWI)を試してみる 」
http://sasboku.blog.fc2.com/blog-entry-54.html
はやく次期バージョンとかで対応されないかなぁ。
それはさておき、解析帳票作るのに使えんのか、使えないのかってとこだけに目がいきがちですがRWIの本質はそこではないと思うのです。
データステップ内で動的にレポート生成できるということが本質で、
データステップ内で何が起きているのかをビジュアル化できるという魅力があると思います。
ということで、今回は、ソートアルゴリズムの授業を想定し、バブルソートをSASの配列で表現した時、配列要素がどのように更新されていくかをRWIでビジュアル化してみましょう。
バブルソートは隣り合う二つの要素を大小比較でひたすら並び替えていく方法です。
並び替えが起きなくなるまでループします。もっとも原始的なアルゴリズムですね。
いまの時代、call sornで一撃やないのとか言わないでね。
普通にSASで書くとこんな感じかな
data _null_;
array ar{10} ( 3 5 8 2 1 9 4 7 6 0);
do until(finish=1);
finish=1;
do i=1 to dim(ar) - 1;
tmp=.;
if ar{i} > ar{i+1} then do;
tmp = ar{i};
ar{i} = ar{i+1};
ar{i+1}=tmp;
finish=0;
put ar{*}=;
end;
end;
end;
run;
結果は
う~ん、地味。じっくりみないとピンとこない。
そこで、上記のコードにRWIをたしちゃいます
data _null_;
array ar{10} ( 3 5 8 2 1 9 4 7 6 0);
array num _numeric_;
/*試行回数*/
total=0;
dcl odsout ob();
ob.layout_gridded(columns: 2,column_gutter: '1mm');
/*初期状態描画*/
ob.region();
ob.table_start();
ob.row_start();
ob.format_cell(data: "回数", style_attr: "background=green color=white");
ob.row_end();
ob.row_start();
ob.format_cell(data: "初期状態");
ob.row_end();
ob.table_end();
ob.region();
ob.table_start();
ob.row_start();
do i=1 to dim(ar);
ob.format_cell(data: vname(ar{i}), style_attr: "background=blue color=white");
end;
ob.row_end();
ob.row_start();
do i=1 to dim(ar);
ob.format_cell(data: ar{i});
end;
ob.row_end();
ob.table_end();
/*バブルソート開始*/
do until(finish=1);
finish=1;/*終了フラグ*/
do i=1 to dim(ar) - 1;
tmp=.;
if ar{i} > ar{i+1} then do;
tmp = ar{i};
ar{i} = ar{i+1};
ar{i+1}=tmp;
finish=0;
total=total+1;
/*描画*/
ob.region();
ob.table_start();
ob.row_start();
ob.format_cell(data: "回数", style_attr: "background=green color=white");
ob.row_end();
ob.row_start();
ob.format_cell(data:cats(total, "回目"));
ob.row_end();
ob.table_end();
ob.region();
ob.table_start();
ob.row_start();
do j=1 to dim(ar);
if j = i or j = i+1then ob.format_cell(data: vname(ar{j}), style_attr: "background=red color=white");
else ob.format_cell(data: vname(ar{j}), style_attr: "background=blue color=white");
end;
ob.row_end();
ob.row_start();
do over num;
ob.format_cell(data: num);
end;
ob.row_end();
ob.table_end();
end;
end;
end;
run;
結果は、ちょっと長くて画像分割しちゃってますが、以下の感じです
やっぱRWI、面白い。これに最初に目をつけて体系的に説明して、世に広めた忘備録のa.matsuさんは本当に偉大だと思います。
「レポート作成インターフェイス(RWI)入門1」
http://sas-boubi.blogspot.jp/2014/10/rwi1.html