Upload
tnoda
View
919
Download
3
Embed Size (px)
Citation preview
仮題: Rについて
@tnoda_
[2015-05-27 Wed]
Rについて
そんな言語で大丈夫か?(Shibuya.lisp なのに的な意味で)
Rについて
そんな言語で大丈夫か?(Shibuya.lisp なのに的な意味で)
かんたんな 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
かんたんな 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
Outline
さっき見たものは何?
Clojure から R の関数を利用するライブラリ Rashinban のデモ
Clojureと非 Javaとの連携
いくつかの方法、Rashinban の選択
Rashinbanを支える Clojureの技術
• R のデータ構造を Clojure で扱う方法• Clojure の値を R に持ち込む方法
Outline
さっき見たものは何?
Clojure から R の関数を利用するライブラリ Rashinban のデモ
Clojureと非 Javaとの連携
いくつかの方法、Rashinban の選択
Rashinbanを支える Clojureの技術
• R のデータ構造を Clojure で扱う方法• Clojure の値を R に持ち込む方法
Outline
さっき見たものは何?
Clojure から R の関数を利用するライブラリ Rashinban のデモ
Clojureと非 Javaとの連携
いくつかの方法、Rashinban の選択
Rashinbanを支える Clojureの技術
• R のデータ構造を Clojure で扱う方法• Clojure の値を R に持ち込む方法
Outline
さっき見たものは何?
Clojure から R の関数を利用するライブラリ Rashinban のデモ
Clojureと非 Javaとの連携
いくつかの方法、Rashinban の選択
Rashinbanを支える Clojureの技術
• R のデータ構造を Clojure で扱う方法• Clojure の値を R に持ち込む方法
Outline
さっき見たものは何?
Clojure から R の関数を利用するライブラリ Rashinban のデモ
Clojureと非 Javaとの連携
いくつかの方法、Rashinban の選択
Rashinbanを支える Clojureの技術
• R のデータ構造を Clojure で扱う方法• Clojure の値を R に持ち込む方法
Outline
さっき見たものは何?
Clojure から R の関数を利用するライブラリ Rashinban のデモ
Clojureと非 Javaとの連携
いくつかの方法、Rashinban の選択
Rashinbanを支える Clojureの技術
• R のデータ構造を Clojure で扱う方法• Clojure の値を R に持ち込む方法
Outline
さっき見たものは何?
Clojure から R の関数を利用するライブラリ Rashinban のデモ
Clojureと非 Javaとの連携
いくつかの方法、Rashinban の選択
Rashinbanを支える Clojureの技術
• R のデータ構造を Clojure で扱う方法• Clojure の値を R に持ち込む方法
Rashinban
!"#$%&'(
)#*&+,#'(#-
.,'/&0(+
123#-456
7&8+4+3
! .0,9"+(
!
!
!
.:.;;
<,+-+4#.0,9"+(
.0,9"+(
=>?
=4*4
Clojureで Rを使いたい
R言語で Clojureを実装する (RClojure)
死。
libRを JVMで利用する
• JNI/JNA• SEGV 即死• C の世界 <=メモリコピー=> JVM の世界
Client/Serverで利用する
• サーバとしての R• クライアントとしての Clojure
Clojureで Rを使いたい
R言語で Clojureを実装する (RClojure)
死。
libRを JVMで利用する
• JNI/JNA• SEGV 即死• C の世界 <=メモリコピー=> JVM の世界
Client/Serverで利用する
• サーバとしての R• クライアントとしての Clojure
Clojureで Rを使いたい
R言語で Clojureを実装する (RClojure)
死。
libRを JVMで利用する
• JNI/JNA• SEGV 即死• C の世界 <=メモリコピー=> JVM の世界
Client/Serverで利用する
• サーバとしての R• クライアントとしての Clojure
Clojureで Rを使いたい
R言語で Clojureを実装する (RClojure)
死。
libRを JVMで利用する
• JNI/JNA
• SEGV 即死• C の世界 <=メモリコピー=> JVM の世界
Client/Serverで利用する
• サーバとしての R• クライアントとしての Clojure
Clojureで Rを使いたい
R言語で Clojureを実装する (RClojure)
死。
libRを JVMで利用する
• JNI/JNA• SEGV 即死
• C の世界 <=メモリコピー=> JVM の世界
Client/Serverで利用する
• サーバとしての R• クライアントとしての Clojure
Clojureで Rを使いたい
R言語で Clojureを実装する (RClojure)
死。
libRを JVMで利用する
• JNI/JNA• SEGV 即死• C の世界 <=メモリコピー=> JVM の世界
Client/Serverで利用する
• サーバとしての R• クライアントとしての Clojure
Clojureで Rを使いたい
R言語で Clojureを実装する (RClojure)
死。
libRを JVMで利用する
• JNI/JNA• SEGV 即死• C の世界 <=メモリコピー=> JVM の世界
Client/Serverで利用する
• サーバとしての R• クライアントとしての Clojure
Clojureで Rを使いたい
R言語で Clojureを実装する (RClojure)
死。
libRを JVMで利用する
• JNI/JNA• SEGV 即死• C の世界 <=メモリコピー=> JVM の世界
Client/Serverで利用する
• サーバとしての R• クライアントとしての Clojure
文献情報
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
Rserveの仕組み
! "#$%&'(
!)('*(+)('*(',
!)('*(+"#-(./, eval()
!"#"$%&'()*+
Rserve利用の課題
Javaオブジェクト→ Clojureの値
• Rserve から受けとる R 関数の実行結果• R の型に対応する Java のクラスのオブジェクト• e.g. REXPDouble, REXPString, RList, . . .• Clojure の値に変換が面倒
Clojureの値→ Rの式
• eval() に渡す式を組み立てる必要
• Clojure の値を一旦全て文字列で表現• Clojure と R との表現が異なる場合は面倒
Rserve利用の課題
Javaオブジェクト→ Clojureの値
• Rserve から受けとる R 関数の実行結果• R の型に対応する Java のクラスのオブジェクト• e.g. REXPDouble, REXPString, RList, . . .• Clojure の値に変換が面倒
Clojureの値→ Rの式
• eval() に渡す式を組み立てる必要
• Clojure の値を一旦全て文字列で表現• Clojure と R との表現が異なる場合は面倒
Rserve利用の課題
Javaオブジェクト→ Clojureの値
• Rserve から受けとる R 関数の実行結果
• R の型に対応する Java のクラスのオブジェクト• e.g. REXPDouble, REXPString, RList, . . .• Clojure の値に変換が面倒
Clojureの値→ Rの式
• eval() に渡す式を組み立てる必要
• Clojure の値を一旦全て文字列で表現• Clojure と R との表現が異なる場合は面倒
Rserve利用の課題
Javaオブジェクト→ Clojureの値
• Rserve から受けとる R 関数の実行結果• R の型に対応する Java のクラスのオブジェクト
• e.g. REXPDouble, REXPString, RList, . . .• Clojure の値に変換が面倒
Clojureの値→ Rの式
• eval() に渡す式を組み立てる必要
• Clojure の値を一旦全て文字列で表現• Clojure と R との表現が異なる場合は面倒
Rserve利用の課題
Javaオブジェクト→ Clojureの値
• Rserve から受けとる R 関数の実行結果• R の型に対応する Java のクラスのオブジェクト• e.g. REXPDouble, REXPString, RList, . . .
• Clojure の値に変換が面倒
Clojureの値→ Rの式
• eval() に渡す式を組み立てる必要
• Clojure の値を一旦全て文字列で表現• Clojure と R との表現が異なる場合は面倒
Rserve利用の課題
Javaオブジェクト→ Clojureの値
• Rserve から受けとる R 関数の実行結果• R の型に対応する Java のクラスのオブジェクト• e.g. REXPDouble, REXPString, RList, . . .• Clojure の値に変換が面倒
Clojureの値→ Rの式
• eval() に渡す式を組み立てる必要
• Clojure の値を一旦全て文字列で表現• Clojure と R との表現が異なる場合は面倒
Rserve利用の課題
Javaオブジェクト→ Clojureの値
• Rserve から受けとる R 関数の実行結果• R の型に対応する Java のクラスのオブジェクト• e.g. REXPDouble, REXPString, RList, . . .• Clojure の値に変換が面倒
Clojureの値→ Rの式
• eval() に渡す式を組み立てる必要
• Clojure の値を一旦全て文字列で表現• Clojure と R との表現が異なる場合は面倒
Rserve利用の課題
Javaオブジェクト→ Clojureの値
• Rserve から受けとる R 関数の実行結果• R の型に対応する Java のクラスのオブジェクト• e.g. REXPDouble, REXPString, RList, . . .• Clojure の値に変換が面倒
Clojureの値→ Rの式
• eval() に渡す式を組み立てる必要
• Clojure の値を一旦全て文字列で表現• Clojure と R との表現が異なる場合は面倒
Rserve利用の課題
Javaオブジェクト→ Clojureの値
• Rserve から受けとる R 関数の実行結果• R の型に対応する Java のクラスのオブジェクト• e.g. REXPDouble, REXPString, RList, . . .• Clojure の値に変換が面倒
Clojureの値→ Rの式
• eval() に渡す式を組み立てる必要
• Clojure の値を一旦全て文字列で表現• Clojure と R との表現が異なる場合は面倒
Rserve利用の課題
Javaオブジェクト→ Clojureの値
• Rserve から受けとる R 関数の実行結果• R の型に対応する Java のクラスのオブジェクト• e.g. REXPDouble, REXPString, RList, . . .• Clojure の値に変換が面倒
Clojureの値→ Rの式
• eval() に渡す式を組み立てる必要
• Clojure の値を一旦全て文字列で表現
• Clojure と R との表現が異なる場合は面倒
Rserve利用の課題
Javaオブジェクト→ Clojureの値
• Rserve から受けとる R 関数の実行結果• R の型に対応する Java のクラスのオブジェクト• e.g. REXPDouble, REXPString, RList, . . .• Clojure の値に変換が面倒
Clojureの値→ Rの式
• eval() に渡す式を組み立てる必要
• Clojure の値を一旦全て文字列で表現• Clojure と R との表現が異なる場合は面倒
Javaから Clojureへ
!"#$%&'()*
!"#$+&,-./)
!"#$+-01
!"#$2333
4*.1&5
6/7
8*1
+-01
Protocolsによる解決
!"#$%&'()*
!"#$+&,-./)
!"#$+-01
!"#$2333
4*.1&5
6/7
8*1
+-01
!"#$#%#&
->clj
Protocolsとは
Javaのインタフェースのようなもの
• すなわち型 (Java のクラス) に基づくディスパッチ• 貧弱なディスパッチによる多態性の提供
そんな貧弱なディスパッチで大丈夫か?
• 「大丈夫だ、問題ない」(2 回目)• Java のインタフェースでも困らない
Protocolsの利点
• Clojure のホスト環境 (Java) に存在する機能• 速さ
Protocolsとは
Javaのインタフェースのようなもの
• すなわち型 (Java のクラス) に基づくディスパッチ• 貧弱なディスパッチによる多態性の提供
そんな貧弱なディスパッチで大丈夫か?
• 「大丈夫だ、問題ない」(2 回目)• Java のインタフェースでも困らない
Protocolsの利点
• Clojure のホスト環境 (Java) に存在する機能• 速さ
Protocolsとは
Javaのインタフェースのようなもの
• すなわち型 (Java のクラス) に基づくディスパッチ
• 貧弱なディスパッチによる多態性の提供
そんな貧弱なディスパッチで大丈夫か?
• 「大丈夫だ、問題ない」(2 回目)• Java のインタフェースでも困らない
Protocolsの利点
• Clojure のホスト環境 (Java) に存在する機能• 速さ
Protocolsとは
Javaのインタフェースのようなもの
• すなわち型 (Java のクラス) に基づくディスパッチ• 貧弱なディスパッチによる多態性の提供
そんな貧弱なディスパッチで大丈夫か?
• 「大丈夫だ、問題ない」(2 回目)• Java のインタフェースでも困らない
Protocolsの利点
• Clojure のホスト環境 (Java) に存在する機能• 速さ
Protocolsとは
Javaのインタフェースのようなもの
• すなわち型 (Java のクラス) に基づくディスパッチ• 貧弱なディスパッチによる多態性の提供
そんな貧弱なディスパッチで大丈夫か?
• 「大丈夫だ、問題ない」(2 回目)• Java のインタフェースでも困らない
Protocolsの利点
• Clojure のホスト環境 (Java) に存在する機能• 速さ
Protocolsとは
Javaのインタフェースのようなもの
• すなわち型 (Java のクラス) に基づくディスパッチ• 貧弱なディスパッチによる多態性の提供
そんな貧弱なディスパッチで大丈夫か?
• 「大丈夫だ、問題ない」(2 回目)• Java のインタフェースでも困らない
Protocolsの利点
• Clojure のホスト環境 (Java) に存在する機能• 速さ
Protocolsとは
Javaのインタフェースのようなもの
• すなわち型 (Java のクラス) に基づくディスパッチ• 貧弱なディスパッチによる多態性の提供
そんな貧弱なディスパッチで大丈夫か?
• 「大丈夫だ、問題ない」(2 回目)
• Java のインタフェースでも困らない
Protocolsの利点
• Clojure のホスト環境 (Java) に存在する機能• 速さ
Protocolsとは
Javaのインタフェースのようなもの
• すなわち型 (Java のクラス) に基づくディスパッチ• 貧弱なディスパッチによる多態性の提供
そんな貧弱なディスパッチで大丈夫か?
• 「大丈夫だ、問題ない」(2 回目)• Java のインタフェースでも困らない
Protocolsの利点
• Clojure のホスト環境 (Java) に存在する機能• 速さ
Protocolsとは
Javaのインタフェースのようなもの
• すなわち型 (Java のクラス) に基づくディスパッチ• 貧弱なディスパッチによる多態性の提供
そんな貧弱なディスパッチで大丈夫か?
• 「大丈夫だ、問題ない」(2 回目)• Java のインタフェースでも困らない
Protocolsの利点
• Clojure のホスト環境 (Java) に存在する機能• 速さ
Protocolsとは
Javaのインタフェースのようなもの
• すなわち型 (Java のクラス) に基づくディスパッチ• 貧弱なディスパッチによる多態性の提供
そんな貧弱なディスパッチで大丈夫か?
• 「大丈夫だ、問題ない」(2 回目)• Java のインタフェースでも困らない
Protocolsの利点
• Clojure のホスト環境 (Java) に存在する機能• 速さ
Protocolsとは
Javaのインタフェースのようなもの
• すなわち型 (Java のクラス) に基づくディスパッチ• 貧弱なディスパッチによる多態性の提供
そんな貧弱なディスパッチで大丈夫か?
• 「大丈夫だ、問題ない」(2 回目)• Java のインタフェースでも困らない
Protocolsの利点
• Clojure のホスト環境 (Java) に存在する機能
• 速さ
Protocolsとは
Javaのインタフェースのようなもの
• すなわち型 (Java のクラス) に基づくディスパッチ• 貧弱なディスパッチによる多態性の提供
そんな貧弱なディスパッチで大丈夫か?
• 「大丈夫だ、問題ない」(2 回目)• Java のインタフェースでも困らない
Protocolsの利点
• Clojure のホスト環境 (Java) に存在する機能• 速さ
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))
Rashinbanを支える技術 1
Protocols
R <=> Clojure のデータ型を自動変換
クライアント起動時
1 サーバに接続 (RConnection.)
2 サーバから built-in 関数一覧を取得3 built-in 関数に相当する Clojure 関数を作成4 search() 関数を使ってパッケージ一覧を取得
5 ls() 関数を使ってパッケージ毎に利用可能な関数一覧を取得
6 全ての R 関数に相当する Clojure 関数を作成
Rashinbanを支える技術 1
Protocols
R <=> Clojure のデータ型を自動変換
クライアント起動時
1 サーバに接続 (RConnection.)
2 サーバから built-in 関数一覧を取得3 built-in 関数に相当する Clojure 関数を作成4 search() 関数を使ってパッケージ一覧を取得
5 ls() 関数を使ってパッケージ毎に利用可能な関数一覧を取得
6 全ての R 関数に相当する Clojure 関数を作成
Rashinbanを支える技術 1
Protocols
R <=> Clojure のデータ型を自動変換
クライアント起動時
1 サーバに接続 (RConnection.)
2 サーバから built-in 関数一覧を取得3 built-in 関数に相当する Clojure 関数を作成4 search() 関数を使ってパッケージ一覧を取得
5 ls() 関数を使ってパッケージ毎に利用可能な関数一覧を取得
6 全ての R 関数に相当する Clojure 関数を作成
Rashinbanを支える技術 1
Protocols
R <=> Clojure のデータ型を自動変換
クライアント起動時
1 サーバに接続 (RConnection.)
2 サーバから built-in 関数一覧を取得3 built-in 関数に相当する Clojure 関数を作成4 search() 関数を使ってパッケージ一覧を取得
5 ls() 関数を使ってパッケージ毎に利用可能な関数一覧を取得
6 全ての R 関数に相当する Clojure 関数を作成
Rashinbanを支える技術 1
Protocols
R <=> Clojure のデータ型を自動変換
クライアント起動時
1 サーバに接続 (RConnection.)
2 サーバから built-in 関数一覧を取得
3 built-in 関数に相当する Clojure 関数を作成4 search() 関数を使ってパッケージ一覧を取得
5 ls() 関数を使ってパッケージ毎に利用可能な関数一覧を取得
6 全ての R 関数に相当する Clojure 関数を作成
Rashinbanを支える技術 1
Protocols
R <=> Clojure のデータ型を自動変換
クライアント起動時
1 サーバに接続 (RConnection.)
2 サーバから built-in 関数一覧を取得3 built-in 関数に相当する Clojure 関数を作成
4 search() 関数を使ってパッケージ一覧を取得
5 ls() 関数を使ってパッケージ毎に利用可能な関数一覧を取得
6 全ての R 関数に相当する Clojure 関数を作成
Rashinbanを支える技術 1
Protocols
R <=> Clojure のデータ型を自動変換
クライアント起動時
1 サーバに接続 (RConnection.)
2 サーバから built-in 関数一覧を取得3 built-in 関数に相当する Clojure 関数を作成4 search() 関数を使ってパッケージ一覧を取得
5 ls() 関数を使ってパッケージ毎に利用可能な関数一覧を取得
6 全ての R 関数に相当する Clojure 関数を作成
Rashinbanを支える技術 1
Protocols
R <=> Clojure のデータ型を自動変換
クライアント起動時
1 サーバに接続 (RConnection.)
2 サーバから built-in 関数一覧を取得3 built-in 関数に相当する Clojure 関数を作成4 search() 関数を使ってパッケージ一覧を取得
5 ls() 関数を使ってパッケージ毎に利用可能な関数一覧を取得
6 全ての R 関数に相当する Clojure 関数を作成
Rashinbanを支える技術 1
Protocols
R <=> Clojure のデータ型を自動変換
クライアント起動時
1 サーバに接続 (RConnection.)
2 サーバから built-in 関数一覧を取得3 built-in 関数に相当する Clojure 関数を作成4 search() 関数を使ってパッケージ一覧を取得
5 ls() 関数を使ってパッケージ毎に利用可能な関数一覧を取得
6 全ての R 関数に相当する Clojure 関数を作成
Checkpoint
Rashinban(回らないほう)
• サーバ/クライアントで R を利用するライブラリ• Rserve のクライアントを利用• 起動時に R サーバに接続して利用可能関数を調べる
Protocols
• Java インタフェース類似機能• 貧弱ながら十分かつ高速なディスパッチ
• Clojure の値を何かに変換するときに便利
Checkpoint
Rashinban(回らないほう)
• サーバ/クライアントで R を利用するライブラリ• Rserve のクライアントを利用• 起動時に R サーバに接続して利用可能関数を調べる
Protocols
• Java インタフェース類似機能• 貧弱ながら十分かつ高速なディスパッチ
• Clojure の値を何かに変換するときに便利
Checkpoint
Rashinban(回らないほう)
• サーバ/クライアントで R を利用するライブラリ• Rserve のクライアントを利用• 起動時に R サーバに接続して利用可能関数を調べる
Protocols
• Java インタフェース類似機能• 貧弱ながら十分かつ高速なディスパッチ
• Clojure の値を何かに変換するときに便利
Checkpoint
Rashinban(回らないほう)
• サーバ/クライアントで R を利用するライブラリ• Rserve のクライアントを利用• 起動時に R サーバに接続して利用可能関数を調べる
Protocols
• Java インタフェース類似機能• 貧弱ながら十分かつ高速なディスパッチ
• Clojure の値を何かに変換するときに便利
Checkpoint
Rashinban(回らないほう)
• サーバ/クライアントで R を利用するライブラリ• Rserve のクライアントを利用• 起動時に R サーバに接続して利用可能関数を調べる
Protocols
• Java インタフェース類似機能• 貧弱ながら十分かつ高速なディスパッチ
• Clojure の値を何かに変換するときに便利
これから R言語の話をしよう
• 型
• クラス
• 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
配列と行列
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"
配列と行列
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"
配列と行列
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"
配列と行列
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"
配列と行列
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"
配列と行列
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"
配列と行列
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"
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
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
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
一つの型、複数のクラス
配列型 (double, integer, …)
• 配列
• 行列
リスト (list)
• リスト
• データフレーム
Protocolsで解決できない問題
一つの型に複数のクラス
• REXPDouble• R の配列 → Clojure のベクタ• R の行列 → Clatrix (BLAS) の行列
• RList• R のリスト → Clojure のマップ• R のデータフレーム → Incanter のデータセット
属性値
• R オブジェクトの属性値を Clojure でも確認したい• ある条件を満たす Clojure の値を R オブジェクトに変換したときに、属性値を付与したい
Rashinbanを支える Clojureの技術 2
Multimethods
• 型ではなく値によるディスパッチ
• すなわち、R オブジェクトの属性値でディスパッチ• Protocols => Multimethods の 2 段階
• Multimethods = 遅い = 一回だけ• Protocols = 速い = 何回も実行される
Metadata
• Clojure の値には任意のメタデータを付与可能• R オブジェクト => Clojure 際に属性値をメタデータに• Clojure => R オブジェクトの際にメタデータを属性値に
Wrap-up
Rashinban
• Clojure から豊富な R の関数を利用• Rserve ベースのクライアント/サーバ
Clojure
• データ型変換
• Protocols• Multimethods
• Metadata• R の属性値を保存