Feb 08, 2010 (Mon)
_ Rapache (mod_r) を使って R で CGI を書くよ。グラフ画像出力編
前回のつづきです。前回は rapache の設定と簡単なCGIを作ってみました。今度は画像を出力して表示する CGI を作ります。内容は、乱数を適当に作ってヒストグラムを作画するCGIです。画像はランダムなファイル名で保存します。
# Functions
header <- function(contenttype) {
setContentType(contenttype)
}
html.head <- function(content) {
cat("<head>\n")
cat(content)
cat("</head>\n")
}
html.body <- function(content) {
cat("<body>\n")
cat(content)
cat("</body></html>\n")
}
randomFileName <- function(prefix, postfix) {
filename <- paste(
prefix,
sprintf("%08d", as.integer(runif(1, 0, 10^7))),
postfix,
sep=""
)
return(filename)
}
# Main
image_dir <- "/var/www/images"
filename <- randomFileName("hist_", ".png")
filepath <- paste(image_dir, filename, sep="/")
data <- rnorm(1000)
# output html
header("text/html")
html.head("<title>Test</title>")
png(filepath)
hist(data)
dev.off()
html.body(
paste(
'<img src="/images/',
filename,
'">',
sep=""
)
)
リロードすると画像が変わるのがわかると思います。次回はもっと役に立つものを作ってみます。
寧々さんかわいいです。
_ 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 を設定します。
# brew
<Directory /var/www/brew>
#SetHandler r-handler
SetHandler r-script
RHandler brew::brew
</Directory>
前回のコードを brew を使って書き直してみます。まずメインのコードです。
cd /var/www/brew sudo jed index.r
ほぼHTMLですね。プロット部分を別なファイル hist.r に追い出しています。brew() でこれを読み込みます。
<% 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>
プロットを描画するコード hist.r は以下の通り。ほぼ R のコードですね。このコードは画像を作り、最終的にはその画像のパスが入った img タグを作ります。
<%
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%>">
http://localhost/brew/index.r にアクセスすると前回と同じようにヒストグラムが表示されます。リロードするとグラフが変わるのを確認してみてください。
これで「HTMLを組む」コードと「計算しプロットを作図する」コードがだいぶ分かれて見通しが良くなりました。次回こそなにか役に立つものを作ってみたいと思います。
リンクは誰にも妨げられないあなたの権利です。お好きにどうぞ。
CC 表示2.1 日本
このサイトの各種商品のリンクは
Amazonアソシエイトや楽天アフィリエイト
を利用している場合があります。