Weitere ähnliche Inhalte Ähnlich wie Shibuya.lisp #28: 仮題: R について (20) Shibuya.lisp #28: 仮題: R について5. かんたんな R の紹介
user> (r/mean [1 2 3 4 5])
[3.0]
user> (r/var [1 2 3 4 5])
[2.5]
user> (r/plot (range 10) (range 10))
nil
12. Outline
さっき見たものは何?
Clojure から R の関数を利用するライブラリ Rashinban のデモ
Clojure と非 Java との連携
いくつかの方法、Rashinban の選択
Rashinban を支える Clojure の技術
• R のデータ構造を Clojure で扱う方法
• Clojure の値を R に持ち込む方法
16. Clojure で R を使いたい
R 言語で Clojure を実装する (RClojure)
死。
17. Clojure で R を使いたい
R 言語で Clojure を実装する (RClojure)
死。
libR を JVM で利用する
• JNI/JNA
18. Clojure で R を使いたい
R 言語で Clojure を実装する (RClojure)
死。
libR を JVM で利用する
• JNI/JNA
• SEGV 即死
19. Clojure で R を使いたい
R 言語で Clojure を実装する (RClojure)
死。
libR を JVM で利用する
• JNI/JNA
• SEGV 即死
• C の世界 <=メモリコピー=> JVM の世界
20. Clojure で R を使いたい
R 言語で Clojure を実装する (RClojure)
死。
libR を JVM で利用する
• JNI/JNA
• SEGV 即死
• C の世界 <=メモリコピー=> JVM の世界
21. Clojure で R を使いたい
R 言語で Clojure を実装する (RClojure)
死。
libR を JVM で利用する
• JNI/JNA
• SEGV 即死
• C の世界 <=メモリコピー=> JVM の世界
Client/Server で利用する
• サーバとしての R
• クライアントとしての Clojure
24. 文献情報
Hornik, K, and F Leisch. “A Fast Way to Provide R Functionality
to Applications.” Proceedings of DSC, no. Dsc (2003).
http://www.ci.tuwien.ac.at/Conferences/DSC-2003/
Proceedings/Urbanek.pdf
30. Rserve 利用の課題
Java オブジェクト → Clojure の値
• Rserve から受けとる R 関数の実行結果
• R の型に対応する Java のクラスのオブジェクト
• e.g. REXPDouble, REXPString, RList, . . .
31. Rserve 利用の課題
Java オブジェクト → Clojure の値
• Rserve から受けとる R 関数の実行結果
• R の型に対応する Java のクラスのオブジェクト
• e.g. REXPDouble, REXPString, RList, . . .
• Clojure の値に変換が面倒
32. Rserve 利用の課題
Java オブジェクト → Clojure の値
• Rserve から受けとる R 関数の実行結果
• R の型に対応する Java のクラスのオブジェクト
• e.g. REXPDouble, REXPString, RList, . . .
• Clojure の値に変換が面倒
33. Rserve 利用の課題
Java オブジェクト → Clojure の値
• Rserve から受けとる R 関数の実行結果
• R の型に対応する Java のクラスのオブジェクト
• e.g. REXPDouble, REXPString, RList, . . .
• Clojure の値に変換が面倒
Clojure の値 → R の式
34. Rserve 利用の課題
Java オブジェクト → Clojure の値
• Rserve から受けとる R 関数の実行結果
• R の型に対応する Java のクラスのオブジェクト
• e.g. REXPDouble, REXPString, RList, . . .
• Clojure の値に変換が面倒
Clojure の値 → R の式
• eval() に渡す式を組み立てる必要
35. Rserve 利用の課題
Java オブジェクト → Clojure の値
• Rserve から受けとる R 関数の実行結果
• R の型に対応する Java のクラスのオブジェクト
• e.g. REXPDouble, REXPString, RList, . . .
• Clojure の値に変換が面倒
Clojure の値 → R の式
• eval() に渡す式を組み立てる必要
• Clojure の値を一旦全て文字列で表現
36. Rserve 利用の課題
Java オブジェクト → Clojure の値
• Rserve から受けとる R 関数の実行結果
• R の型に対応する Java のクラスのオブジェクト
• e.g. REXPDouble, REXPString, RList, . . .
• Clojure の値に変換が面倒
Clojure の値 → R の式
• eval() に渡す式を組み立てる必要
• Clojure の値を一旦全て文字列で表現
• Clojure と R との表現が異なる場合は面倒
49. Protocols とは
Java のインタフェースのようなもの
• すなわち型 (Java のクラス) に基づくディスパッチ
• 貧弱なディスパッチによる多態性の提供
そんな貧弱なディスパッチで大丈夫か?
• 「大丈夫だ、問題ない」(2 回目)
• Java のインタフェースでも困らない
Protocols の利点
• Clojure のホスト環境 (Java) に存在する機能
50. Protocols とは
Java のインタフェースのようなもの
• すなわち型 (Java のクラス) に基づくディスパッチ
• 貧弱なディスパッチによる多態性の提供
そんな貧弱なディスパッチで大丈夫か?
• 「大丈夫だ、問題ない」(2 回目)
• Java のインタフェースでも困らない
Protocols の利点
• Clojure のホスト環境 (Java) に存在する機能
• 速さ
51. Rashinban での例
1 (defprotocol Rexp
2 (->clj [x]))
3
4 (extend-protocol Rexp
5 REXPDouble
6 (->clj [rds] (-> rds .asDoubles vec))
7 REXPGenericVector
8 (->clj [rxs] (-> rxs .asList ->clj))
9 REXPInteger
10 (->clj [ris] (-> ris .asIntegers vec))
11 REXPLogical
12 (->clj [rls] (->> rls .asBytes (map pos?) vec))
13 REXPNull
14 (->clj [_] nil)
15 REXPString
16 (->clj [rfs] (-> rfs .asStrings vec))
17 REXP
18 (->clj [rexp] (str rexp))
19 RList
20 (->clj [rxs] (reduce (fn
21 [acc k]
58. Rashinban を支える技術 1
Protocols
R <=> Clojure のデータ型を自動変換
クライアント起動時
1 サーバに接続 (RConnection.)
2 サーバから built-in 関数一覧を取得
3 built-in 関数に相当する Clojure 関数を作成
4 search() 関数を使ってパッケージ一覧を取得
59. Rashinban を支える技術 1
Protocols
R <=> Clojure のデータ型を自動変換
クライアント起動時
1 サーバに接続 (RConnection.)
2 サーバから built-in 関数一覧を取得
3 built-in 関数に相当する Clojure 関数を作成
4 search() 関数を使ってパッケージ一覧を取得
5 ls() 関数を使ってパッケージ毎に利用可能な関数一覧を取得
60. Rashinban を支える技術 1
Protocols
R <=> Clojure のデータ型を自動変換
クライアント起動時
1 サーバに接続 (RConnection.)
2 サーバから built-in 関数一覧を取得
3 built-in 関数に相当する Clojure 関数を作成
4 search() 関数を使ってパッケージ一覧を取得
5 ls() 関数を使ってパッケージ毎に利用可能な関数一覧を取得
6 全ての R 関数に相当する Clojure 関数を作成
67. R の型
"NULL"' NULL
"symbol"' a variable name
"pairlist"' a pairlist object (mainly internal)
"closure"' a function
"environment"'an environment
"promise"' an object used to implement lazy evaluation
"language"' an R language construct
"special"' an internal function that does not evaluate
its arguments
"builtin"' an internal function that evaluates its
arguments
"char"' a scalar' string object (internal only) ***
"logical"' a vector containing logical values
"integer"' a vector containing integer values
"double"' a vector containing real values
"complex"' a vector containing complex values
"character"' a vector containing character values
"..."' the special variable length argument ***
"any"' a special type that matches all types: there
are no objects of this type
"expression"'an expression object
"list"' a list
"bytecode"' byte code (internal only) ***
"externalptr"'an external pointer object
"weakref"' a weak reference object
"raw"' a vector containing bytes
"S4"' an S4 object which is not a simple object
72. 配列と行列
c(1, 2, 3) の型は?
答え: double
> typeof(c(1, 2, 3))
[1] "double"
R の行列 (matrix) の型は?
73. 配列と行列
c(1, 2, 3) の型は?
答え: double
> typeof(c(1, 2, 3))
[1] "double"
R の行列 (matrix) の型は?
答え: double
74. 配列と行列
c(1, 2, 3) の型は?
答え: double
> typeof(c(1, 2, 3))
[1] "double"
R の行列 (matrix) の型は?
答え: double
> typeof(matrix(c(1, 2, 3, 4, 5, 6), nrow=2, ncol=3))
[1] "double"
77. R はどのようにして両者を区別するか?
属性
• R のオブジェクトは任意の属性をもつことができる
• 振舞いに影響を与える属性がある
• class, dim 属性
例
> attr(matrix(c(1, 2, 3, 4, 5, 6), nrow=2, ncol=3), "dim")
[1] 2 3
> attr(c(1, 2, 3), "dim")
NULL
79. Protocols で解決できない問題
一つの型に複数のクラス
• REXPDouble
• R の配列 → Clojure のベクタ
• R の行列 → Clatrix (BLAS) の行列
• RList
• R のリスト → Clojure のマップ
• R のデータフレーム → Incanter のデータセット
属性値
• R オブジェクトの属性値を Clojure でも確認したい
• ある条件を満たす Clojure の値を R オブジェクトに変換した
ときに、属性値を付与したい
80. Rashinban を支える Clojure の技術 2
Multimethods
• 型ではなく値によるディスパッチ
• すなわち、R オブジェクトの属性値でディスパッチ
• Protocols => Multimethods の 2 段階
• Multimethods = 遅い = 一回だけ
• Protocols = 速い = 何回も実行される
Metadata
• Clojure の値には任意のメタデータを付与可能
• R オブジェクト => Clojure 際に属性値をメタデータに
• Clojure => R オブジェクトの際にメタデータを属性値に