shibuya.lisp #28: 仮題: r について

81
仮題:R について @tnoda_ [2015-05-27 Wed]

Upload: tnoda

Post on 06-Aug-2015

921 views

Category:

Engineering


3 download

TRANSCRIPT

Page 1: Shibuya.lisp #28: 仮題: R について

仮題: Rについて

@tnoda_

[2015-05-27 Wed]

Page 2: Shibuya.lisp #28: 仮題: R について

Rについて

そんな言語で大丈夫か?(Shibuya.lisp なのに的な意味で)

Page 3: Shibuya.lisp #28: 仮題: R について

Rについて

そんな言語で大丈夫か?(Shibuya.lisp なのに的な意味で)

Page 4: Shibuya.lisp #28: 仮題: R について

かんたんな 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

Page 5: Shibuya.lisp #28: 仮題: R について

かんたんな 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

Page 6: Shibuya.lisp #28: 仮題: R について

Outline

さっき見たものは何?

Clojure から R の関数を利用するライブラリ Rashinban のデモ

Clojureと非 Javaとの連携

いくつかの方法、Rashinban の選択

Rashinbanを支える Clojureの技術

• R のデータ構造を Clojure で扱う方法• Clojure の値を R に持ち込む方法

Page 7: Shibuya.lisp #28: 仮題: R について

Outline

さっき見たものは何?

Clojure から R の関数を利用するライブラリ Rashinban のデモ

Clojureと非 Javaとの連携

いくつかの方法、Rashinban の選択

Rashinbanを支える Clojureの技術

• R のデータ構造を Clojure で扱う方法• Clojure の値を R に持ち込む方法

Page 8: Shibuya.lisp #28: 仮題: R について

Outline

さっき見たものは何?

Clojure から R の関数を利用するライブラリ Rashinban のデモ

Clojureと非 Javaとの連携

いくつかの方法、Rashinban の選択

Rashinbanを支える Clojureの技術

• R のデータ構造を Clojure で扱う方法• Clojure の値を R に持ち込む方法

Page 9: Shibuya.lisp #28: 仮題: R について

Outline

さっき見たものは何?

Clojure から R の関数を利用するライブラリ Rashinban のデモ

Clojureと非 Javaとの連携

いくつかの方法、Rashinban の選択

Rashinbanを支える Clojureの技術

• R のデータ構造を Clojure で扱う方法• Clojure の値を R に持ち込む方法

Page 10: Shibuya.lisp #28: 仮題: R について

Outline

さっき見たものは何?

Clojure から R の関数を利用するライブラリ Rashinban のデモ

Clojureと非 Javaとの連携

いくつかの方法、Rashinban の選択

Rashinbanを支える Clojureの技術

• R のデータ構造を Clojure で扱う方法• Clojure の値を R に持ち込む方法

Page 11: Shibuya.lisp #28: 仮題: R について

Outline

さっき見たものは何?

Clojure から R の関数を利用するライブラリ Rashinban のデモ

Clojureと非 Javaとの連携

いくつかの方法、Rashinban の選択

Rashinbanを支える Clojureの技術

• R のデータ構造を Clojure で扱う方法• Clojure の値を R に持ち込む方法

Page 12: Shibuya.lisp #28: 仮題: R について

Outline

さっき見たものは何?

Clojure から R の関数を利用するライブラリ Rashinban のデモ

Clojureと非 Javaとの連携

いくつかの方法、Rashinban の選択

Rashinbanを支える Clojureの技術

• R のデータ構造を Clojure で扱う方法• Clojure の値を R に持ち込む方法

Page 13: Shibuya.lisp #28: 仮題: R について

Rashinban

!"#$%&'(

)#*&+,#'(#-

.,'/&0(+

123#-456

7&8+4+3

! .0,9"+(

!

!

!

.:.;;

<,+-+4#.0,9"+(

.0,9"+(

=>?

=4*4

Page 14: Shibuya.lisp #28: 仮題: R について

Clojureで Rを使いたい

R言語で Clojureを実装する (RClojure)

死。

libRを JVMで利用する

• JNI/JNA• SEGV 即死• C の世界 <=メモリコピー=> JVM の世界

Client/Serverで利用する

• サーバとしての R• クライアントとしての Clojure

Page 15: Shibuya.lisp #28: 仮題: R について

Clojureで Rを使いたい

R言語で Clojureを実装する (RClojure)

死。

libRを JVMで利用する

• JNI/JNA• SEGV 即死• C の世界 <=メモリコピー=> JVM の世界

Client/Serverで利用する

• サーバとしての R• クライアントとしての Clojure

Page 16: Shibuya.lisp #28: 仮題: R について

Clojureで Rを使いたい

R言語で Clojureを実装する (RClojure)

死。

libRを JVMで利用する

• JNI/JNA• SEGV 即死• C の世界 <=メモリコピー=> JVM の世界

Client/Serverで利用する

• サーバとしての R• クライアントとしての Clojure

Page 17: Shibuya.lisp #28: 仮題: R について

Clojureで Rを使いたい

R言語で Clojureを実装する (RClojure)

死。

libRを JVMで利用する

• JNI/JNA

• SEGV 即死• C の世界 <=メモリコピー=> JVM の世界

Client/Serverで利用する

• サーバとしての R• クライアントとしての Clojure

Page 18: Shibuya.lisp #28: 仮題: R について

Clojureで Rを使いたい

R言語で Clojureを実装する (RClojure)

死。

libRを JVMで利用する

• JNI/JNA• SEGV 即死

• C の世界 <=メモリコピー=> JVM の世界

Client/Serverで利用する

• サーバとしての R• クライアントとしての Clojure

Page 19: Shibuya.lisp #28: 仮題: R について

Clojureで Rを使いたい

R言語で Clojureを実装する (RClojure)

死。

libRを JVMで利用する

• JNI/JNA• SEGV 即死• C の世界 <=メモリコピー=> JVM の世界

Client/Serverで利用する

• サーバとしての R• クライアントとしての Clojure

Page 20: Shibuya.lisp #28: 仮題: R について

Clojureで Rを使いたい

R言語で Clojureを実装する (RClojure)

死。

libRを JVMで利用する

• JNI/JNA• SEGV 即死• C の世界 <=メモリコピー=> JVM の世界

Client/Serverで利用する

• サーバとしての R• クライアントとしての Clojure

Page 21: Shibuya.lisp #28: 仮題: R について

Clojureで Rを使いたい

R言語で Clojureを実装する (RClojure)

死。

libRを JVMで利用する

• JNI/JNA• SEGV 即死• C の世界 <=メモリコピー=> JVM の世界

Client/Serverで利用する

• サーバとしての R• クライアントとしての Clojure

Page 22: Shibuya.lisp #28: 仮題: R について

Rのクライアントサーバ実装

Figure : http://rforge.net/Rserve

Page 23: Shibuya.lisp #28: 仮題: R について

Rのクライアントサーバ実装

Figure : http://rforge.net/Rserve

Page 24: Shibuya.lisp #28: 仮題: R について

文献情報

Hornik, K, and F Leisch. “A Fast Way to Provide R Functionalityto Applications.” Proceedings of DSC, no. Dsc (2003).http://www.ci.tuwien.ac.at/Conferences/DSC-2003/Proceedings/Urbanek.pdf

Page 25: Shibuya.lisp #28: 仮題: R について

Rserveの仕組み

! "#$%&'(

!)('*(+)('*(',

!)('*(+"#-(./, eval()

!"#"$%&'()*+

Page 26: Shibuya.lisp #28: 仮題: R について

Rserve利用の課題

Javaオブジェクト→ Clojureの値

• Rserve から受けとる R 関数の実行結果• R の型に対応する Java のクラスのオブジェクト• e.g. REXPDouble, REXPString, RList, . . .• Clojure の値に変換が面倒

Clojureの値→ Rの式

• eval() に渡す式を組み立てる必要

• Clojure の値を一旦全て文字列で表現• Clojure と R との表現が異なる場合は面倒

Page 27: Shibuya.lisp #28: 仮題: R について

Rserve利用の課題

Javaオブジェクト→ Clojureの値

• Rserve から受けとる R 関数の実行結果• R の型に対応する Java のクラスのオブジェクト• e.g. REXPDouble, REXPString, RList, . . .• Clojure の値に変換が面倒

Clojureの値→ Rの式

• eval() に渡す式を組み立てる必要

• Clojure の値を一旦全て文字列で表現• Clojure と R との表現が異なる場合は面倒

Page 28: Shibuya.lisp #28: 仮題: R について

Rserve利用の課題

Javaオブジェクト→ Clojureの値

• Rserve から受けとる R 関数の実行結果

• R の型に対応する Java のクラスのオブジェクト• e.g. REXPDouble, REXPString, RList, . . .• Clojure の値に変換が面倒

Clojureの値→ Rの式

• eval() に渡す式を組み立てる必要

• Clojure の値を一旦全て文字列で表現• Clojure と R との表現が異なる場合は面倒

Page 29: Shibuya.lisp #28: 仮題: R について

Rserve利用の課題

Javaオブジェクト→ Clojureの値

• Rserve から受けとる R 関数の実行結果• R の型に対応する Java のクラスのオブジェクト

• e.g. REXPDouble, REXPString, RList, . . .• Clojure の値に変換が面倒

Clojureの値→ Rの式

• eval() に渡す式を組み立てる必要

• Clojure の値を一旦全て文字列で表現• Clojure と R との表現が異なる場合は面倒

Page 30: Shibuya.lisp #28: 仮題: R について

Rserve利用の課題

Javaオブジェクト→ Clojureの値

• Rserve から受けとる R 関数の実行結果• R の型に対応する Java のクラスのオブジェクト• e.g. REXPDouble, REXPString, RList, . . .

• Clojure の値に変換が面倒

Clojureの値→ Rの式

• eval() に渡す式を組み立てる必要

• Clojure の値を一旦全て文字列で表現• Clojure と R との表現が異なる場合は面倒

Page 31: Shibuya.lisp #28: 仮題: R について

Rserve利用の課題

Javaオブジェクト→ Clojureの値

• Rserve から受けとる R 関数の実行結果• R の型に対応する Java のクラスのオブジェクト• e.g. REXPDouble, REXPString, RList, . . .• Clojure の値に変換が面倒

Clojureの値→ Rの式

• eval() に渡す式を組み立てる必要

• Clojure の値を一旦全て文字列で表現• Clojure と R との表現が異なる場合は面倒

Page 32: Shibuya.lisp #28: 仮題: R について

Rserve利用の課題

Javaオブジェクト→ Clojureの値

• Rserve から受けとる R 関数の実行結果• R の型に対応する Java のクラスのオブジェクト• e.g. REXPDouble, REXPString, RList, . . .• Clojure の値に変換が面倒

Clojureの値→ Rの式

• eval() に渡す式を組み立てる必要

• Clojure の値を一旦全て文字列で表現• Clojure と R との表現が異なる場合は面倒

Page 33: Shibuya.lisp #28: 仮題: R について

Rserve利用の課題

Javaオブジェクト→ Clojureの値

• Rserve から受けとる R 関数の実行結果• R の型に対応する Java のクラスのオブジェクト• e.g. REXPDouble, REXPString, RList, . . .• Clojure の値に変換が面倒

Clojureの値→ Rの式

• eval() に渡す式を組み立てる必要

• Clojure の値を一旦全て文字列で表現• Clojure と R との表現が異なる場合は面倒

Page 34: Shibuya.lisp #28: 仮題: R について

Rserve利用の課題

Javaオブジェクト→ Clojureの値

• Rserve から受けとる R 関数の実行結果• R の型に対応する Java のクラスのオブジェクト• e.g. REXPDouble, REXPString, RList, . . .• Clojure の値に変換が面倒

Clojureの値→ Rの式

• eval() に渡す式を組み立てる必要

• Clojure の値を一旦全て文字列で表現• Clojure と R との表現が異なる場合は面倒

Page 35: Shibuya.lisp #28: 仮題: R について

Rserve利用の課題

Javaオブジェクト→ Clojureの値

• Rserve から受けとる R 関数の実行結果• R の型に対応する Java のクラスのオブジェクト• e.g. REXPDouble, REXPString, RList, . . .• Clojure の値に変換が面倒

Clojureの値→ Rの式

• eval() に渡す式を組み立てる必要

• Clojure の値を一旦全て文字列で表現

• Clojure と R との表現が異なる場合は面倒

Page 36: Shibuya.lisp #28: 仮題: R について

Rserve利用の課題

Javaオブジェクト→ Clojureの値

• Rserve から受けとる R 関数の実行結果• R の型に対応する Java のクラスのオブジェクト• e.g. REXPDouble, REXPString, RList, . . .• Clojure の値に変換が面倒

Clojureの値→ Rの式

• eval() に渡す式を組み立てる必要

• Clojure の値を一旦全て文字列で表現• Clojure と R との表現が異なる場合は面倒

Page 37: Shibuya.lisp #28: 仮題: R について

Javaから Clojureへ

!"#$%&'()*

!"#$+&,-./)

!"#$+-01

!"#$2333

4*.1&5

6/7

8*1

+-01

Page 38: Shibuya.lisp #28: 仮題: R について

Protocolsによる解決

!"#$%&'()*

!"#$+&,-./)

!"#$+-01

!"#$2333

4*.1&5

6/7

8*1

+-01

!"#$#%#&

->clj

Page 39: Shibuya.lisp #28: 仮題: R について

Protocolsとは

Javaのインタフェースのようなもの

• すなわち型 (Java のクラス) に基づくディスパッチ• 貧弱なディスパッチによる多態性の提供

そんな貧弱なディスパッチで大丈夫か?

• 「大丈夫だ、問題ない」(2 回目)• Java のインタフェースでも困らない

Protocolsの利点

• Clojure のホスト環境 (Java) に存在する機能• 速さ

Page 40: Shibuya.lisp #28: 仮題: R について

Protocolsとは

Javaのインタフェースのようなもの

• すなわち型 (Java のクラス) に基づくディスパッチ• 貧弱なディスパッチによる多態性の提供

そんな貧弱なディスパッチで大丈夫か?

• 「大丈夫だ、問題ない」(2 回目)• Java のインタフェースでも困らない

Protocolsの利点

• Clojure のホスト環境 (Java) に存在する機能• 速さ

Page 41: Shibuya.lisp #28: 仮題: R について

Protocolsとは

Javaのインタフェースのようなもの

• すなわち型 (Java のクラス) に基づくディスパッチ

• 貧弱なディスパッチによる多態性の提供

そんな貧弱なディスパッチで大丈夫か?

• 「大丈夫だ、問題ない」(2 回目)• Java のインタフェースでも困らない

Protocolsの利点

• Clojure のホスト環境 (Java) に存在する機能• 速さ

Page 42: Shibuya.lisp #28: 仮題: R について

Protocolsとは

Javaのインタフェースのようなもの

• すなわち型 (Java のクラス) に基づくディスパッチ• 貧弱なディスパッチによる多態性の提供

そんな貧弱なディスパッチで大丈夫か?

• 「大丈夫だ、問題ない」(2 回目)• Java のインタフェースでも困らない

Protocolsの利点

• Clojure のホスト環境 (Java) に存在する機能• 速さ

Page 43: Shibuya.lisp #28: 仮題: R について

Protocolsとは

Javaのインタフェースのようなもの

• すなわち型 (Java のクラス) に基づくディスパッチ• 貧弱なディスパッチによる多態性の提供

そんな貧弱なディスパッチで大丈夫か?

• 「大丈夫だ、問題ない」(2 回目)• Java のインタフェースでも困らない

Protocolsの利点

• Clojure のホスト環境 (Java) に存在する機能• 速さ

Page 44: Shibuya.lisp #28: 仮題: R について

Protocolsとは

Javaのインタフェースのようなもの

• すなわち型 (Java のクラス) に基づくディスパッチ• 貧弱なディスパッチによる多態性の提供

そんな貧弱なディスパッチで大丈夫か?

• 「大丈夫だ、問題ない」(2 回目)• Java のインタフェースでも困らない

Protocolsの利点

• Clojure のホスト環境 (Java) に存在する機能• 速さ

Page 45: Shibuya.lisp #28: 仮題: R について

Protocolsとは

Javaのインタフェースのようなもの

• すなわち型 (Java のクラス) に基づくディスパッチ• 貧弱なディスパッチによる多態性の提供

そんな貧弱なディスパッチで大丈夫か?

• 「大丈夫だ、問題ない」(2 回目)

• Java のインタフェースでも困らない

Protocolsの利点

• Clojure のホスト環境 (Java) に存在する機能• 速さ

Page 46: Shibuya.lisp #28: 仮題: R について

Protocolsとは

Javaのインタフェースのようなもの

• すなわち型 (Java のクラス) に基づくディスパッチ• 貧弱なディスパッチによる多態性の提供

そんな貧弱なディスパッチで大丈夫か?

• 「大丈夫だ、問題ない」(2 回目)• Java のインタフェースでも困らない

Protocolsの利点

• Clojure のホスト環境 (Java) に存在する機能• 速さ

Page 47: Shibuya.lisp #28: 仮題: R について

Protocolsとは

Javaのインタフェースのようなもの

• すなわち型 (Java のクラス) に基づくディスパッチ• 貧弱なディスパッチによる多態性の提供

そんな貧弱なディスパッチで大丈夫か?

• 「大丈夫だ、問題ない」(2 回目)• Java のインタフェースでも困らない

Protocolsの利点

• Clojure のホスト環境 (Java) に存在する機能• 速さ

Page 48: Shibuya.lisp #28: 仮題: R について

Protocolsとは

Javaのインタフェースのようなもの

• すなわち型 (Java のクラス) に基づくディスパッチ• 貧弱なディスパッチによる多態性の提供

そんな貧弱なディスパッチで大丈夫か?

• 「大丈夫だ、問題ない」(2 回目)• Java のインタフェースでも困らない

Protocolsの利点

• Clojure のホスト環境 (Java) に存在する機能• 速さ

Page 49: Shibuya.lisp #28: 仮題: R について

Protocolsとは

Javaのインタフェースのようなもの

• すなわち型 (Java のクラス) に基づくディスパッチ• 貧弱なディスパッチによる多態性の提供

そんな貧弱なディスパッチで大丈夫か?

• 「大丈夫だ、問題ない」(2 回目)• Java のインタフェースでも困らない

Protocolsの利点

• Clojure のホスト環境 (Java) に存在する機能

• 速さ

Page 50: Shibuya.lisp #28: 仮題: R について

Protocolsとは

Javaのインタフェースのようなもの

• すなわち型 (Java のクラス) に基づくディスパッチ• 貧弱なディスパッチによる多態性の提供

そんな貧弱なディスパッチで大丈夫か?

• 「大丈夫だ、問題ない」(2 回目)• Java のインタフェースでも困らない

Protocolsの利点

• Clojure のホスト環境 (Java) に存在する機能• 速さ

Page 51: Shibuya.lisp #28: 仮題: R について

Rashinbanでの例1 (defprotocol Rexp2 (->clj [x]))34 (extend-protocol Rexp5 REXPDouble6 (->clj [rds] (-> rds .asDoubles vec))7 REXPGenericVector8 (->clj [rxs] (-> rxs .asList ->clj))9 REXPInteger

10 (->clj [ris] (-> ris .asIntegers vec))11 REXPLogical12 (->clj [rls] (->> rls .asBytes (map pos?) vec))13 REXPNull14 (->clj [_] nil)15 REXPString16 (->clj [rfs] (-> rfs .asStrings vec))17 REXP18 (->clj [rexp] (str rexp))19 RList20 (->clj [rxs] (reduce (fn21 [acc k]22 (assoc acc23 (keyword k)24 (->> (str k)25 (.at rxs)26 ->clj)))27 {}28 (.keys rxs)))29 nil30 (->clj [_] nil))

Page 52: Shibuya.lisp #28: 仮題: R について

Rashinbanを支える技術 1

Protocols

R <=> Clojure のデータ型を自動変換

クライアント起動時

1 サーバに接続 (RConnection.)

2 サーバから built-in 関数一覧を取得3 built-in 関数に相当する Clojure 関数を作成4 search() 関数を使ってパッケージ一覧を取得

5 ls() 関数を使ってパッケージ毎に利用可能な関数一覧を取得

6 全ての R 関数に相当する Clojure 関数を作成

Page 53: Shibuya.lisp #28: 仮題: R について

Rashinbanを支える技術 1

Protocols

R <=> Clojure のデータ型を自動変換

クライアント起動時

1 サーバに接続 (RConnection.)

2 サーバから built-in 関数一覧を取得3 built-in 関数に相当する Clojure 関数を作成4 search() 関数を使ってパッケージ一覧を取得

5 ls() 関数を使ってパッケージ毎に利用可能な関数一覧を取得

6 全ての R 関数に相当する Clojure 関数を作成

Page 54: Shibuya.lisp #28: 仮題: R について

Rashinbanを支える技術 1

Protocols

R <=> Clojure のデータ型を自動変換

クライアント起動時

1 サーバに接続 (RConnection.)

2 サーバから built-in 関数一覧を取得3 built-in 関数に相当する Clojure 関数を作成4 search() 関数を使ってパッケージ一覧を取得

5 ls() 関数を使ってパッケージ毎に利用可能な関数一覧を取得

6 全ての R 関数に相当する Clojure 関数を作成

Page 55: Shibuya.lisp #28: 仮題: R について

Rashinbanを支える技術 1

Protocols

R <=> Clojure のデータ型を自動変換

クライアント起動時

1 サーバに接続 (RConnection.)

2 サーバから built-in 関数一覧を取得3 built-in 関数に相当する Clojure 関数を作成4 search() 関数を使ってパッケージ一覧を取得

5 ls() 関数を使ってパッケージ毎に利用可能な関数一覧を取得

6 全ての R 関数に相当する Clojure 関数を作成

Page 56: Shibuya.lisp #28: 仮題: R について

Rashinbanを支える技術 1

Protocols

R <=> Clojure のデータ型を自動変換

クライアント起動時

1 サーバに接続 (RConnection.)

2 サーバから built-in 関数一覧を取得

3 built-in 関数に相当する Clojure 関数を作成4 search() 関数を使ってパッケージ一覧を取得

5 ls() 関数を使ってパッケージ毎に利用可能な関数一覧を取得

6 全ての R 関数に相当する Clojure 関数を作成

Page 57: Shibuya.lisp #28: 仮題: R について

Rashinbanを支える技術 1

Protocols

R <=> Clojure のデータ型を自動変換

クライアント起動時

1 サーバに接続 (RConnection.)

2 サーバから built-in 関数一覧を取得3 built-in 関数に相当する Clojure 関数を作成

4 search() 関数を使ってパッケージ一覧を取得

5 ls() 関数を使ってパッケージ毎に利用可能な関数一覧を取得

6 全ての R 関数に相当する Clojure 関数を作成

Page 58: Shibuya.lisp #28: 仮題: R について

Rashinbanを支える技術 1

Protocols

R <=> Clojure のデータ型を自動変換

クライアント起動時

1 サーバに接続 (RConnection.)

2 サーバから built-in 関数一覧を取得3 built-in 関数に相当する Clojure 関数を作成4 search() 関数を使ってパッケージ一覧を取得

5 ls() 関数を使ってパッケージ毎に利用可能な関数一覧を取得

6 全ての R 関数に相当する Clojure 関数を作成

Page 59: Shibuya.lisp #28: 仮題: R について

Rashinbanを支える技術 1

Protocols

R <=> Clojure のデータ型を自動変換

クライアント起動時

1 サーバに接続 (RConnection.)

2 サーバから built-in 関数一覧を取得3 built-in 関数に相当する Clojure 関数を作成4 search() 関数を使ってパッケージ一覧を取得

5 ls() 関数を使ってパッケージ毎に利用可能な関数一覧を取得

6 全ての R 関数に相当する Clojure 関数を作成

Page 60: Shibuya.lisp #28: 仮題: R について

Rashinbanを支える技術 1

Protocols

R <=> Clojure のデータ型を自動変換

クライアント起動時

1 サーバに接続 (RConnection.)

2 サーバから built-in 関数一覧を取得3 built-in 関数に相当する Clojure 関数を作成4 search() 関数を使ってパッケージ一覧を取得

5 ls() 関数を使ってパッケージ毎に利用可能な関数一覧を取得

6 全ての R 関数に相当する Clojure 関数を作成

Page 61: Shibuya.lisp #28: 仮題: R について

Checkpoint

Rashinban(回らないほう)

• サーバ/クライアントで R を利用するライブラリ• Rserve のクライアントを利用• 起動時に R サーバに接続して利用可能関数を調べる

Protocols

• Java インタフェース類似機能• 貧弱ながら十分かつ高速なディスパッチ

• Clojure の値を何かに変換するときに便利

Page 62: Shibuya.lisp #28: 仮題: R について

Checkpoint

Rashinban(回らないほう)

• サーバ/クライアントで R を利用するライブラリ• Rserve のクライアントを利用• 起動時に R サーバに接続して利用可能関数を調べる

Protocols

• Java インタフェース類似機能• 貧弱ながら十分かつ高速なディスパッチ

• Clojure の値を何かに変換するときに便利

Page 63: Shibuya.lisp #28: 仮題: R について

Checkpoint

Rashinban(回らないほう)

• サーバ/クライアントで R を利用するライブラリ• Rserve のクライアントを利用• 起動時に R サーバに接続して利用可能関数を調べる

Protocols

• Java インタフェース類似機能• 貧弱ながら十分かつ高速なディスパッチ

• Clojure の値を何かに変換するときに便利

Page 64: Shibuya.lisp #28: 仮題: R について

Checkpoint

Rashinban(回らないほう)

• サーバ/クライアントで R を利用するライブラリ• Rserve のクライアントを利用• 起動時に R サーバに接続して利用可能関数を調べる

Protocols

• Java インタフェース類似機能• 貧弱ながら十分かつ高速なディスパッチ

• Clojure の値を何かに変換するときに便利

Page 65: Shibuya.lisp #28: 仮題: R について

Checkpoint

Rashinban(回らないほう)

• サーバ/クライアントで R を利用するライブラリ• Rserve のクライアントを利用• 起動時に R サーバに接続して利用可能関数を調べる

Protocols

• Java インタフェース類似機能• 貧弱ながら十分かつ高速なディスパッチ

• Clojure の値を何かに変換するときに便利

Page 66: Shibuya.lisp #28: 仮題: R について

これから R言語の話をしよう

• 型

• クラス

• R のオブジェクト指向

Page 67: Shibuya.lisp #28: 仮題: R について

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

Page 68: Shibuya.lisp #28: 仮題: R について

配列と行列

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"

Page 69: Shibuya.lisp #28: 仮題: R について

配列と行列

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"

Page 70: Shibuya.lisp #28: 仮題: R について

配列と行列

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"

Page 71: Shibuya.lisp #28: 仮題: R について

配列と行列

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"

Page 72: Shibuya.lisp #28: 仮題: R について

配列と行列

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"

Page 73: Shibuya.lisp #28: 仮題: R について

配列と行列

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"

Page 74: Shibuya.lisp #28: 仮題: R について

配列と行列

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"

Page 75: Shibuya.lisp #28: 仮題: R について

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

Page 76: Shibuya.lisp #28: 仮題: R について

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

Page 77: Shibuya.lisp #28: 仮題: R について

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

Page 78: Shibuya.lisp #28: 仮題: R について

一つの型、複数のクラス

配列型 (double, integer, …)

• 配列

• 行列

リスト (list)

• リスト

• データフレーム

Page 79: Shibuya.lisp #28: 仮題: R について

Protocolsで解決できない問題

一つの型に複数のクラス

• REXPDouble• R の配列 → Clojure のベクタ• R の行列 → Clatrix (BLAS) の行列

• RList• R のリスト → Clojure のマップ• R のデータフレーム → Incanter のデータセット

属性値

• R オブジェクトの属性値を Clojure でも確認したい• ある条件を満たす Clojure の値を R オブジェクトに変換したときに、属性値を付与したい

Page 80: Shibuya.lisp #28: 仮題: R について

Rashinbanを支える Clojureの技術 2

Multimethods

• 型ではなく値によるディスパッチ

• すなわち、R オブジェクトの属性値でディスパッチ• Protocols => Multimethods の 2 段階

• Multimethods = 遅い = 一回だけ• Protocols = 速い = 何回も実行される

Metadata

• Clojure の値には任意のメタデータを付与可能• R オブジェクト => Clojure 際に属性値をメタデータに• Clojure => R オブジェクトの際にメタデータを属性値に

Page 81: Shibuya.lisp #28: 仮題: R について

Wrap-up

Rashinban

• Clojure から豊富な R の関数を利用• Rserve ベースのクライアント/サーバ

Clojure

• データ型変換

• Protocols• Multimethods

• Metadata• R の属性値を保存