shibuya.lisp #28: 仮題: r について
TRANSCRIPT
![Page 1: Shibuya.lisp #28: 仮題: R について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/1.jpg)
仮題: Rについて
@tnoda_
[2015-05-27 Wed]
![Page 2: Shibuya.lisp #28: 仮題: R について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/2.jpg)
Rについて
そんな言語で大丈夫か?(Shibuya.lisp なのに的な意味で)
![Page 3: Shibuya.lisp #28: 仮題: R について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/3.jpg)
Rについて
そんな言語で大丈夫か?(Shibuya.lisp なのに的な意味で)
![Page 4: Shibuya.lisp #28: 仮題: R について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/4.jpg)
かんたんな 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 について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/5.jpg)
かんたんな 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 について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/6.jpg)
Outline
さっき見たものは何?
Clojure から R の関数を利用するライブラリ Rashinban のデモ
Clojureと非 Javaとの連携
いくつかの方法、Rashinban の選択
Rashinbanを支える Clojureの技術
• R のデータ構造を Clojure で扱う方法• Clojure の値を R に持ち込む方法
![Page 7: Shibuya.lisp #28: 仮題: R について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/7.jpg)
Outline
さっき見たものは何?
Clojure から R の関数を利用するライブラリ Rashinban のデモ
Clojureと非 Javaとの連携
いくつかの方法、Rashinban の選択
Rashinbanを支える Clojureの技術
• R のデータ構造を Clojure で扱う方法• Clojure の値を R に持ち込む方法
![Page 8: Shibuya.lisp #28: 仮題: R について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/8.jpg)
Outline
さっき見たものは何?
Clojure から R の関数を利用するライブラリ Rashinban のデモ
Clojureと非 Javaとの連携
いくつかの方法、Rashinban の選択
Rashinbanを支える Clojureの技術
• R のデータ構造を Clojure で扱う方法• Clojure の値を R に持ち込む方法
![Page 9: Shibuya.lisp #28: 仮題: R について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/9.jpg)
Outline
さっき見たものは何?
Clojure から R の関数を利用するライブラリ Rashinban のデモ
Clojureと非 Javaとの連携
いくつかの方法、Rashinban の選択
Rashinbanを支える Clojureの技術
• R のデータ構造を Clojure で扱う方法• Clojure の値を R に持ち込む方法
![Page 10: Shibuya.lisp #28: 仮題: R について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/10.jpg)
Outline
さっき見たものは何?
Clojure から R の関数を利用するライブラリ Rashinban のデモ
Clojureと非 Javaとの連携
いくつかの方法、Rashinban の選択
Rashinbanを支える Clojureの技術
• R のデータ構造を Clojure で扱う方法• Clojure の値を R に持ち込む方法
![Page 11: Shibuya.lisp #28: 仮題: R について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/11.jpg)
Outline
さっき見たものは何?
Clojure から R の関数を利用するライブラリ Rashinban のデモ
Clojureと非 Javaとの連携
いくつかの方法、Rashinban の選択
Rashinbanを支える Clojureの技術
• R のデータ構造を Clojure で扱う方法• Clojure の値を R に持ち込む方法
![Page 12: Shibuya.lisp #28: 仮題: R について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/12.jpg)
Outline
さっき見たものは何?
Clojure から R の関数を利用するライブラリ Rashinban のデモ
Clojureと非 Javaとの連携
いくつかの方法、Rashinban の選択
Rashinbanを支える Clojureの技術
• R のデータ構造を Clojure で扱う方法• Clojure の値を R に持ち込む方法
![Page 13: Shibuya.lisp #28: 仮題: R について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/13.jpg)
Rashinban
!"#$%&'(
)#*&+,#'(#-
.,'/&0(+
123#-456
7&8+4+3
! .0,9"+(
!
!
!
.:.;;
<,+-+4#.0,9"+(
.0,9"+(
=>?
=4*4
![Page 14: Shibuya.lisp #28: 仮題: R について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/14.jpg)
Clojureで Rを使いたい
R言語で Clojureを実装する (RClojure)
死。
libRを JVMで利用する
• JNI/JNA• SEGV 即死• C の世界 <=メモリコピー=> JVM の世界
Client/Serverで利用する
• サーバとしての R• クライアントとしての Clojure
![Page 15: Shibuya.lisp #28: 仮題: R について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/15.jpg)
Clojureで Rを使いたい
R言語で Clojureを実装する (RClojure)
死。
libRを JVMで利用する
• JNI/JNA• SEGV 即死• C の世界 <=メモリコピー=> JVM の世界
Client/Serverで利用する
• サーバとしての R• クライアントとしての Clojure
![Page 16: Shibuya.lisp #28: 仮題: R について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/16.jpg)
Clojureで Rを使いたい
R言語で Clojureを実装する (RClojure)
死。
libRを JVMで利用する
• JNI/JNA• SEGV 即死• C の世界 <=メモリコピー=> JVM の世界
Client/Serverで利用する
• サーバとしての R• クライアントとしての Clojure
![Page 17: Shibuya.lisp #28: 仮題: R について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/17.jpg)
Clojureで Rを使いたい
R言語で Clojureを実装する (RClojure)
死。
libRを JVMで利用する
• JNI/JNA
• SEGV 即死• C の世界 <=メモリコピー=> JVM の世界
Client/Serverで利用する
• サーバとしての R• クライアントとしての Clojure
![Page 18: Shibuya.lisp #28: 仮題: R について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/18.jpg)
Clojureで Rを使いたい
R言語で Clojureを実装する (RClojure)
死。
libRを JVMで利用する
• JNI/JNA• SEGV 即死
• C の世界 <=メモリコピー=> JVM の世界
Client/Serverで利用する
• サーバとしての R• クライアントとしての Clojure
![Page 19: Shibuya.lisp #28: 仮題: R について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/19.jpg)
Clojureで Rを使いたい
R言語で Clojureを実装する (RClojure)
死。
libRを JVMで利用する
• JNI/JNA• SEGV 即死• C の世界 <=メモリコピー=> JVM の世界
Client/Serverで利用する
• サーバとしての R• クライアントとしての Clojure
![Page 20: Shibuya.lisp #28: 仮題: R について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/20.jpg)
Clojureで Rを使いたい
R言語で Clojureを実装する (RClojure)
死。
libRを JVMで利用する
• JNI/JNA• SEGV 即死• C の世界 <=メモリコピー=> JVM の世界
Client/Serverで利用する
• サーバとしての R• クライアントとしての Clojure
![Page 21: Shibuya.lisp #28: 仮題: R について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/21.jpg)
Clojureで Rを使いたい
R言語で Clojureを実装する (RClojure)
死。
libRを JVMで利用する
• JNI/JNA• SEGV 即死• C の世界 <=メモリコピー=> JVM の世界
Client/Serverで利用する
• サーバとしての R• クライアントとしての Clojure
![Page 24: Shibuya.lisp #28: 仮題: R について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/24.jpg)
文献情報
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 について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/25.jpg)
Rserveの仕組み
! "#$%&'(
!)('*(+)('*(',
!)('*(+"#-(./, eval()
!"#"$%&'()*+
![Page 26: Shibuya.lisp #28: 仮題: R について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/26.jpg)
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 について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/27.jpg)
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 について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/28.jpg)
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 について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/29.jpg)
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 について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/30.jpg)
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 について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/31.jpg)
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 について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/32.jpg)
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 について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/33.jpg)
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 について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/34.jpg)
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 について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/35.jpg)
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 について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/36.jpg)
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 について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/37.jpg)
Javaから Clojureへ
!"#$%&'()*
!"#$+&,-./)
!"#$+-01
!"#$2333
4*.1&5
6/7
8*1
+-01
![Page 38: Shibuya.lisp #28: 仮題: R について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/38.jpg)
Protocolsによる解決
!"#$%&'()*
!"#$+&,-./)
!"#$+-01
!"#$2333
4*.1&5
6/7
8*1
+-01
!"#$#%#&
->clj
![Page 39: Shibuya.lisp #28: 仮題: R について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/39.jpg)
Protocolsとは
Javaのインタフェースのようなもの
• すなわち型 (Java のクラス) に基づくディスパッチ• 貧弱なディスパッチによる多態性の提供
そんな貧弱なディスパッチで大丈夫か?
• 「大丈夫だ、問題ない」(2 回目)• Java のインタフェースでも困らない
Protocolsの利点
• Clojure のホスト環境 (Java) に存在する機能• 速さ
![Page 40: Shibuya.lisp #28: 仮題: R について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/40.jpg)
Protocolsとは
Javaのインタフェースのようなもの
• すなわち型 (Java のクラス) に基づくディスパッチ• 貧弱なディスパッチによる多態性の提供
そんな貧弱なディスパッチで大丈夫か?
• 「大丈夫だ、問題ない」(2 回目)• Java のインタフェースでも困らない
Protocolsの利点
• Clojure のホスト環境 (Java) に存在する機能• 速さ
![Page 41: Shibuya.lisp #28: 仮題: R について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/41.jpg)
Protocolsとは
Javaのインタフェースのようなもの
• すなわち型 (Java のクラス) に基づくディスパッチ
• 貧弱なディスパッチによる多態性の提供
そんな貧弱なディスパッチで大丈夫か?
• 「大丈夫だ、問題ない」(2 回目)• Java のインタフェースでも困らない
Protocolsの利点
• Clojure のホスト環境 (Java) に存在する機能• 速さ
![Page 42: Shibuya.lisp #28: 仮題: R について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/42.jpg)
Protocolsとは
Javaのインタフェースのようなもの
• すなわち型 (Java のクラス) に基づくディスパッチ• 貧弱なディスパッチによる多態性の提供
そんな貧弱なディスパッチで大丈夫か?
• 「大丈夫だ、問題ない」(2 回目)• Java のインタフェースでも困らない
Protocolsの利点
• Clojure のホスト環境 (Java) に存在する機能• 速さ
![Page 43: Shibuya.lisp #28: 仮題: R について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/43.jpg)
Protocolsとは
Javaのインタフェースのようなもの
• すなわち型 (Java のクラス) に基づくディスパッチ• 貧弱なディスパッチによる多態性の提供
そんな貧弱なディスパッチで大丈夫か?
• 「大丈夫だ、問題ない」(2 回目)• Java のインタフェースでも困らない
Protocolsの利点
• Clojure のホスト環境 (Java) に存在する機能• 速さ
![Page 44: Shibuya.lisp #28: 仮題: R について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/44.jpg)
Protocolsとは
Javaのインタフェースのようなもの
• すなわち型 (Java のクラス) に基づくディスパッチ• 貧弱なディスパッチによる多態性の提供
そんな貧弱なディスパッチで大丈夫か?
• 「大丈夫だ、問題ない」(2 回目)• Java のインタフェースでも困らない
Protocolsの利点
• Clojure のホスト環境 (Java) に存在する機能• 速さ
![Page 45: Shibuya.lisp #28: 仮題: R について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/45.jpg)
Protocolsとは
Javaのインタフェースのようなもの
• すなわち型 (Java のクラス) に基づくディスパッチ• 貧弱なディスパッチによる多態性の提供
そんな貧弱なディスパッチで大丈夫か?
• 「大丈夫だ、問題ない」(2 回目)
• Java のインタフェースでも困らない
Protocolsの利点
• Clojure のホスト環境 (Java) に存在する機能• 速さ
![Page 46: Shibuya.lisp #28: 仮題: R について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/46.jpg)
Protocolsとは
Javaのインタフェースのようなもの
• すなわち型 (Java のクラス) に基づくディスパッチ• 貧弱なディスパッチによる多態性の提供
そんな貧弱なディスパッチで大丈夫か?
• 「大丈夫だ、問題ない」(2 回目)• Java のインタフェースでも困らない
Protocolsの利点
• Clojure のホスト環境 (Java) に存在する機能• 速さ
![Page 47: Shibuya.lisp #28: 仮題: R について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/47.jpg)
Protocolsとは
Javaのインタフェースのようなもの
• すなわち型 (Java のクラス) に基づくディスパッチ• 貧弱なディスパッチによる多態性の提供
そんな貧弱なディスパッチで大丈夫か?
• 「大丈夫だ、問題ない」(2 回目)• Java のインタフェースでも困らない
Protocolsの利点
• Clojure のホスト環境 (Java) に存在する機能• 速さ
![Page 48: Shibuya.lisp #28: 仮題: R について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/48.jpg)
Protocolsとは
Javaのインタフェースのようなもの
• すなわち型 (Java のクラス) に基づくディスパッチ• 貧弱なディスパッチによる多態性の提供
そんな貧弱なディスパッチで大丈夫か?
• 「大丈夫だ、問題ない」(2 回目)• Java のインタフェースでも困らない
Protocolsの利点
• Clojure のホスト環境 (Java) に存在する機能• 速さ
![Page 49: Shibuya.lisp #28: 仮題: R について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/49.jpg)
Protocolsとは
Javaのインタフェースのようなもの
• すなわち型 (Java のクラス) に基づくディスパッチ• 貧弱なディスパッチによる多態性の提供
そんな貧弱なディスパッチで大丈夫か?
• 「大丈夫だ、問題ない」(2 回目)• Java のインタフェースでも困らない
Protocolsの利点
• Clojure のホスト環境 (Java) に存在する機能
• 速さ
![Page 50: Shibuya.lisp #28: 仮題: R について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/50.jpg)
Protocolsとは
Javaのインタフェースのようなもの
• すなわち型 (Java のクラス) に基づくディスパッチ• 貧弱なディスパッチによる多態性の提供
そんな貧弱なディスパッチで大丈夫か?
• 「大丈夫だ、問題ない」(2 回目)• Java のインタフェースでも困らない
Protocolsの利点
• Clojure のホスト環境 (Java) に存在する機能• 速さ
![Page 51: Shibuya.lisp #28: 仮題: R について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/51.jpg)
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 について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/52.jpg)
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 について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/53.jpg)
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 について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/54.jpg)
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 について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/55.jpg)
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 について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/56.jpg)
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 について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/57.jpg)
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 について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/58.jpg)
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 について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/59.jpg)
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 について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/60.jpg)
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 について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/61.jpg)
Checkpoint
Rashinban(回らないほう)
• サーバ/クライアントで R を利用するライブラリ• Rserve のクライアントを利用• 起動時に R サーバに接続して利用可能関数を調べる
Protocols
• Java インタフェース類似機能• 貧弱ながら十分かつ高速なディスパッチ
• Clojure の値を何かに変換するときに便利
![Page 62: Shibuya.lisp #28: 仮題: R について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/62.jpg)
Checkpoint
Rashinban(回らないほう)
• サーバ/クライアントで R を利用するライブラリ• Rserve のクライアントを利用• 起動時に R サーバに接続して利用可能関数を調べる
Protocols
• Java インタフェース類似機能• 貧弱ながら十分かつ高速なディスパッチ
• Clojure の値を何かに変換するときに便利
![Page 63: Shibuya.lisp #28: 仮題: R について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/63.jpg)
Checkpoint
Rashinban(回らないほう)
• サーバ/クライアントで R を利用するライブラリ• Rserve のクライアントを利用• 起動時に R サーバに接続して利用可能関数を調べる
Protocols
• Java インタフェース類似機能• 貧弱ながら十分かつ高速なディスパッチ
• Clojure の値を何かに変換するときに便利
![Page 64: Shibuya.lisp #28: 仮題: R について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/64.jpg)
Checkpoint
Rashinban(回らないほう)
• サーバ/クライアントで R を利用するライブラリ• Rserve のクライアントを利用• 起動時に R サーバに接続して利用可能関数を調べる
Protocols
• Java インタフェース類似機能• 貧弱ながら十分かつ高速なディスパッチ
• Clojure の値を何かに変換するときに便利
![Page 65: Shibuya.lisp #28: 仮題: R について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/65.jpg)
Checkpoint
Rashinban(回らないほう)
• サーバ/クライアントで R を利用するライブラリ• Rserve のクライアントを利用• 起動時に R サーバに接続して利用可能関数を調べる
Protocols
• Java インタフェース類似機能• 貧弱ながら十分かつ高速なディスパッチ
• Clojure の値を何かに変換するときに便利
![Page 66: Shibuya.lisp #28: 仮題: R について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/66.jpg)
これから R言語の話をしよう
• 型
• クラス
• R のオブジェクト指向
![Page 67: Shibuya.lisp #28: 仮題: R について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/67.jpg)
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 について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/68.jpg)
配列と行列
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 について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/69.jpg)
配列と行列
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 について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/70.jpg)
配列と行列
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 について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/71.jpg)
配列と行列
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 について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/72.jpg)
配列と行列
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 について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/73.jpg)
配列と行列
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 について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/74.jpg)
配列と行列
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 について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/75.jpg)
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 について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/76.jpg)
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 について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/77.jpg)
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 について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/78.jpg)
一つの型、複数のクラス
配列型 (double, integer, …)
• 配列
• 行列
リスト (list)
• リスト
• データフレーム
![Page 79: Shibuya.lisp #28: 仮題: R について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/79.jpg)
Protocolsで解決できない問題
一つの型に複数のクラス
• REXPDouble• R の配列 → Clojure のベクタ• R の行列 → Clatrix (BLAS) の行列
• RList• R のリスト → Clojure のマップ• R のデータフレーム → Incanter のデータセット
属性値
• R オブジェクトの属性値を Clojure でも確認したい• ある条件を満たす Clojure の値を R オブジェクトに変換したときに、属性値を付与したい
![Page 80: Shibuya.lisp #28: 仮題: R について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/80.jpg)
Rashinbanを支える Clojureの技術 2
Multimethods
• 型ではなく値によるディスパッチ
• すなわち、R オブジェクトの属性値でディスパッチ• Protocols => Multimethods の 2 段階
• Multimethods = 遅い = 一回だけ• Protocols = 速い = 何回も実行される
Metadata
• Clojure の値には任意のメタデータを付与可能• R オブジェクト => Clojure 際に属性値をメタデータに• Clojure => R オブジェクトの際にメタデータを属性値に
![Page 81: Shibuya.lisp #28: 仮題: R について](https://reader030.vdocuments.site/reader030/viewer/2022013122/55c295c7bb61eb54128b4659/html5/thumbnails/81.jpg)
Wrap-up
Rashinban
• Clojure から豊富な R の関数を利用• Rserve ベースのクライアント/サーバ
Clojure
• データ型変換
• Protocols• Multimethods
• Metadata• R の属性値を保存