2010/02/09

Rapache (mod_r) を使って R で CGI を書くよ。テンプレートエンジンBrew編

前回は寧n、いえ、なんでもないです、前回のコードでは、cat() を使ってがんばってHTMLタグを出力していました。これは気持ち悪いです。RのコードとHTMLのコードを分けておかないと、どちらかに変更があった場合に、お互いの影響に配慮しながら修正をしなければならなくなります。これは面倒ですね。

こんなときは、テンプレートエンジンを使って、HTMLを作る部分とRのコードをなるべく分けるのが良いですね。R にも Ruby でいうところの erb のようなテンプレートエンジンがあります。今回は、brew というテンプレートフレームワークを使います。

brewのインストールと設定


まず brew をインストールします

sudo R
install.pakcages("brew")
q()


次に apache の設定をします。

sudo mkdir /var/www/brew
sudo jed /etc/apache2/sites-available/default


RHandler に brew を設定します。
[html]
# brew
<Directory /var/www/brew>
#SetHandler r-handler
SetHandler r-script
RHandler brew::brew
</Directory>
[/html]

brew で実装し仕直す


前回のコードを brew を使って書き直してみます。まずメインのコードです。

cd /var/www/brew
sudo jed index.r


ほぼHTMLですね。プロット部分を別なファイル hist.r に追い出しています。brew() でこれを読み込みます。

[html]
<% setContentType('text/html') %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">;
<html>
<head><title>Test</title>
</head>
<body>
<% brew('/var/www/brew/hist.r') %>
</body>
</html>
[/html]

プロットを描画するコード hist.r は以下の通り。ほぼ R のコードですね。このコードは画像を作り、最終的にはその画像のパスが入った img タグを作ります。

[html]
<%
randomFileName <- function(prefix, postfix) {
filename <- paste(
prefix,
sprintf("%08d", as.integer(runif(1, 0, 10^7))),
postfix,
sep=""
)
return(filename)
}

image_dir <- "/var/www/images"
filename <- randomFileName("hist_", ".png")
filepath <- paste(image_dir, filename, sep="/")

data <- rnorm(1000)
png(filepath)
hist(data)
dev.off()
%>
<img src="/images/<%=filename%>">
[/html]

http://localhost/brew/index.r にアクセスすると前回と同じようにヒストグラムが表示されます。リロードするとグラフが変わるのを確認してみてください。

これで「HTMLを組む」コードと「計算しプロットを作図する」コードがだいぶ分かれて見通しが良くなりました。次回こそなにか役に立つものを作ってみたいと思います。