読者です 読者をやめる 読者になる 読者になる

hiratake55 の作業メモ

R, Javascript, Python, Linux and Hadoop

R-php をインストール & 使ってみた

Web ブラウザからサーバ上の R を実行できる PHP スクリプトR-php をインストールしてみました。
ちなみに、R-php 自体は 2005 年から存在し、特に新しい技術、という訳でもないです。


以上の図のような構成で動作しており、計算はサーバ側で行います。

今回使用したサーバは、CentOS 5.4。以下、インストールの方法。作業は全て root で実行します。

1. Apache, PHP, MySQL, ImageMagick のダウンロード

既にインストール済みの場合は省略。以下のように、すべて yum でインストール可能。

# yum install httpd httpd-devel php php-devel php-mbstring php-mysql mysql mysql-server ImageMagick ImageMagick-devel

2. R をインストール

既にインストール済みの場合は省略。RHEL5 用を流用します。

# yum install libgfortran xdg-utils perl-File-Copy-Recursive
# wget ftp://ftp.ecc.u-tokyo.ac.jp/CRAN/bin/linux/redhat/el5/i386/R-2.10.0-2.el5.i386.rpm
# rpm -ihv R-2.10.0-2.el5.i386.rpm

うまくいかない場合は、下記の RPM をインストール。

# wget ftp://ftp.ecc.u-tokyo.ac.jp/CRAN/bin/linux/redhat/el5/i386/R-core-2.10.0-2.el5.i386.rpm
# wget ftp://ftp.ecc.u-tokyo.ac.jp/CRAN/bin/linux/redhat/el5/i386/R-devel-2.10.0-2.el5.i386.rpm
# wget ftp://ftp.ecc.u-tokyo.ac.jp/CRAN/bin/linux/redhat/el5/i386/libRmath-2.10.0-2.el5.i386.rpm
# wget ftp://ftp.ecc.u-tokyo.ac.jp/CRAN/bin/linux/redhat/el5/i386/libRmath-devel-2.10.0-2.el5.i386.rpm
# rpm -ihv R-core-2.10.0-2.el5.i386.rpm
# rpm -ihv R-devel-2.10.0-2.el5.i386.rpm
# rpm -ihv libRmath-2.10.0-2.el5.i386.rpm
# rpm -ihv libRmath-devel-2.10.0-2.el5.i386.rpm

詳細はここ (CentOS 5.2 に R をインストールする - CMOSにっき) を参照。

3. R-php をダウンロード & インストール

R-php の公式サイト (http://dssm.unipa.it/R-php/) から最新版 (1.0) をダウンロードします。

# wget --content-disposition 'http://dssm.unipa.it/R-php/?cmd=downPack&pack=R-php-1.tar.gz'
# tar xvzf R-php-1.tar.gz
# rm R-php-1.tar.gz
# mv R-php-1/ /var/www/R-php/

4. アクセス制限の設定

計算資源を誰でも使用できる状態は、さすがにマズいので、Digest 認証を設定します。

# vi /etc/httpd/conf.d/r-php.conf
Alias /R-php "/var/www/R-php/"

<Directory "/var/www/R-php">
    AuthType Digest
    AuthName "R-php" 
    AuthDigestDomain /R-php/ 
    AuthUserFile /etc/httpd/conf/.htdigest_rphp
    Require valid-user
</Directory>

# htdigest -c /etc/httpd/conf/.htdigest_rphp 'R-php' R-php
# service httpd restart

5.データベースの設定

R-php が、MySQLに R というデータベースを作成します。
MySQL 側で新しいデータベースを作成する、等といった作業は不要です。

次のファイルを編集します。

# vi /var/www/R-php/include/conf.php
<?
$dbuser = "(MySQL のユーザ)";
$dbpass = "(MySQL のパスワード)";
?>

6. 画像出力の設定

R-php では、R が出力する画像を ImageMagick を使って、PS 形式から PNG 形式に変換しています。
しかし、現在のバージョンの R では PDF 形式がデフォルトなので、変更します。

/var/www/R-php/R/pages/result/index.php
# chmod +w /var/www/R-php/R/pages/result/index.php
# vi /var/www/R-php/R/pages/result/index.php
<?
...
/* 44 行目付近 */
//delfile("./pages/tmp/$temp/*.ps"); //コメントアウトする
delfile("./pages/tmp/$temp/*.pdf"); //追加

/* 57 行目付近 */
//exec("$convert_command ./pages/tmp/$temp/Rplots.ps ./pages/tmp/$temp/R.png"); //コメントアウトする
exec("$convert_command ./pages/tmp/$temp/Rplots.pdf ./pages/tmp/$temp/R.png"); //追加

/* 63 行目付近 */
//exec("$convert_command -antialias -rotate 90 $fn ./pages/tmp/$temp/$nn.png"); //コメントアウトする
exec("$convert_command -antialias $fn ./pages/tmp/$temp/$nn.png"); //追加

...
?>
/var/www/R-php/R-gui/pages/result/index.php
# chmod +w /var/www/R-php/R-gui/pages/result/index.php
# vi /var/www/R-php/R-gui/pages/result/index.php
<?
...
/* 77 行目付近 */
//delfile("./pages/tmp/$temp/*.ps"); //コメントアウトする
delfile("./pages/tmp/$temp/*.pdf"); //追加

/* 106 行目付近 */
//exec("$convert_command ./pages/tmp/$temp/Rplots.ps ./pages/tmp/$temp/R.png"); //コメントアウトする
exec("$convert_command ./pages/tmp/$temp/Rplots.pdf ./pages/tmp/$temp/R.png"); //追加

/* 112 行目付近 */
//exec("$convert_command -antialias -rotate 90 $fn ./pages/tmp/$temp/$nn.png"); //コメントアウトする
exec("$convert_command -antialias $fn ./pages/tmp/$temp/$nn.png"); //追加

...
?>

7. 動作確認

http://(サーバのアドレス)/R-php/ へアクセス。

使ってみた


フォームにプログラムを入力、または、ファイルをアップロード。


こんな具合に出力結果が表示されます。

iPhone からも使えます

もちろん、iPhone など、フルブラウザが搭載されたモバイルガジェットからも実行できます。


ggplot2 パッケージを使用した例

FAQ

パッケージの使用は出来る?
root で R を起動してインストールしたパッケージは、library() 関数で問題なく動作します。
パッケージのインストールは出来る?
install.packages(), file.remove(), scan() など、"危険なコマンド" は実行できないようになっています。
対話型の操作は出来る?
対話型の操作 (たとえば、BRugs の codamenu() など) には向いていないでしょうね。
ヘルプは参照出来る?
未確認。

感想

  • ところどころイタリア語が表示されて驚く。
  • AjaxActionScript を駆使すれば、もっと利便性が向上すると思う。特に、ESS 的な機能を実装したい。
  • 例えば、
    • 選択範囲を実行
    • カラースキーマ (WYSIWYG エディタ)
    • データフレームを見ながらコーディング
    • ヘルプの表示
    • Gmail 風の自動保存機能
    • 認証機能の標準装備
    • 実行結果の自動メール送信機能 など。
  • そもそも、2006 年からメンテナンスされていないっぽいので、作るなら、1 から作り直した方が良さそう。
  • 時間に余裕があれば、SourceForge などのオープンソースプロジェクトで改良版作りたいですね。

ダウンロードはこちらから

R-php
http://dssm.unipa.it/R-php/


眠りながら書いたので、間違っている点などあるかもしれません。見つけた方は指摘ください。