この記事は、Japan.R 2017での講演内容を再編成した物です。
Node.jsで作られたアプリケーションや、Electronアプリケーションを、Rと連携させたいと思ったことはありませんか?
JavaScriptとRの連携
Rで統計処理をしているときに、JavaScriptでインタラクティブなビジュアライゼーションを行いたい、ということはあると思います。この目的であれば、shiny (Winston Chang et al.)という便利なパッケージがあります。htmlwidgets(JJ Allaire et al.)も便利なパッケージで、threejsやbokehなどの連携を行うことができます。
では、逆は、というとあまり決定的なアプリケーションはありません。npmをみてみると、controlr, r-script, computerというパッケージがありますが、どのパッケージもRをspawnしてstdin/stdout経由でアクセスしているだけであり、すこし物足りません。
そこで、勉強がてら自前ですこし作ってみることにしました。
libr-bridge
libr-bridgeはlibr(WindowsではR.dll)と連携して、Node.js環境からRを使用するパッケージです。
let r = new R(); const arrA = [1.00, 3.36, 8.01, 1.22, 3.74, 2.43, 7.95, 8.32, 7.45, 4.36]; const arrB = [1.04, 3.65, 6.82, 1.46, 2.70, 2.49, 7.48, 8.28, 8.93, 5.63]; /* Some functions are already loaded to libr-bridge */ console.log("Mean of arrA: " + r.mean(arrA)); console.log("Mean of arrB: " + r.mean(arrB)); console.log("Peason's correlation coefficient: " + r.cor(arrA, arrB));
libr-bridgeを利用することで、Rの関数にアクセスすることが出来ます。eval関数も備えていますので、とりあえずデータだけ渡してしまって、凝った作業をRスクリプトで行い、結果を受け取ることも出来ます。
まだまだfactorやdata.frame, S3/S4クラスなど対応しないと行けないことは山積みですが、Node.jsで出来る作業の幅を広げてくれます。
どうやって実現しているの?
ぜひ、ソースコードを見ていただきたいですがlibRのAPIをゴリゴリに呼び出して動作を行っています。Rの内部挙動を理解するのにも役に立ちました。
小ネタ
Rでは倍精度浮動小数点(double9は他言語と同じようにIEEE 754に従って、実装されています。これは、1bitの符号と、11bitの指数部、52bitの仮数部で数値を表す方式です。
NaNはこの決まりに含まれており、指数部のbitがすべて1であり、仮数部が0以外のもの、と定められています。これは他の言語も共通です。
しかし、 NAはR独自の表現であり、この決まりの中には含まれていません。
Rでは、少し特殊な仕組みでNAを実現していて、仮数部が1954(R言語設計者の一人のRoss Ihakaの誕生年)のNaNをNAとして区別して扱っています。
今回、libr-bridgeを作るのに、Rの内部を調べていくうちにこういった小ネタをいくつか見つけたので、また次の機会にでも記事にしたいと思います。