仮題: R について
@tnoda_
[2015-05-27 Wed]
R について
R について
そんな言語で大丈夫か?
(Shibuya.lisp なのに的な意味で)
かんたんな 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
Outline
Outline
さっき見たものは何?
Outline
さっき見たものは何?
Clojure から R の関数を利用するライブラリ Rashinban のデモ
Outline
さっき見たものは何?
Clojure から R の関数を利用するライブラリ Rashinban のデモ
Clojure と非 Java との連携
Outline
さっき見たものは何?
Clojure から R の関数を利用するライブラリ Rashinban のデモ
Clojure と非 Java との連携
いくつかの方法、Rashinban の選択
Outline
さっき見たものは何?
Clojure から R の関数を利用するライブラリ Rashinban のデモ
Clojure と非 Java との連携
いくつかの方法、Rashinban の選択
Rashinban を支える Clojure の技術
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 を使いたい
Clojure で R を使いたい
R 言語で Clojure を実装する (RClojure)
Clojure で R を使いたい
R 言語で Clojure を実装する (RClojure)
死。
Clojure で R を使いたい
R 言語で Clojure を実装する (RClojure)
死。
libR を JVM で利用する
• JNI/JNA
Clojure で R を使いたい
R 言語で Clojure を実装する (RClojure)
死。
libR を JVM で利用する
• JNI/JNA
• SEGV 即死
Clojure で R を使いたい
R 言語で Clojure を実装する (RClojure)
死。
libR を JVM で利用する
• JNI/JNA
• SEGV 即死
• C の世界 <=メモリコピー=> JVM の世界
Clojure で R を使いたい
R 言語で Clojure を実装する (RClojure)
死。
libR を JVM で利用する
• JNI/JNA
• SEGV 即死
• C の世界 <=メモリコピー=> JVM の世界
Clojure で R を使いたい
R 言語で Clojure を実装する (RClojure)
死。
libR を JVM で利用する
• JNI/JNA
• SEGV 即死
• C の世界 <=メモリコピー=> JVM の世界
Client/Server で利用する
• サーバとしての R
• クライアントとしての Clojure
R のクライアントサーバ実装
R のクライアントサーバ実装
Figure : http://rforge.net/Rserve
文献情報
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
Rserve の仕組み
eval()
Rserve 利用の課題
Rserve 利用の課題
Java オブジェクト → Clojure の値
Rserve 利用の課題
Java オブジェクト → Clojure の値
• Rserve から受けとる R 関数の実行結果
Rserve 利用の課題
Java オブジェクト → Clojure の値
• Rserve から受けとる R 関数の実行結果
• R の型に対応する Java のクラスのオブジェクト
Rserve 利用の課題
Java オブジェクト → Clojure の値
• Rserve から受けとる R 関数の実行結果
• R の型に対応する Java のクラスのオブジェクト
• e.g. REXPDouble, REXPString, RList, . . .
Rserve 利用の課題
Java オブジェクト → Clojure の値
• Rserve から受けとる R 関数の実行結果
• R の型に対応する Java のクラスのオブジェクト
• e.g. REXPDouble, REXPString, RList, . . .
• Clojure の値に変換が面倒
Rserve 利用の課題
Java オブジェクト → Clojure の値
• Rserve から受けとる R 関数の実行結果
• R の型に対応する Java のクラスのオブジェクト
• e.g. REXPDouble, REXPString, RList, . . .
• Clojure の値に変換が面倒
Rserve 利用の課題
Java オブジェクト → Clojure の値
• Rserve から受けとる R 関数の実行結果
• R の型に対応する Java のクラスのオブジェクト
• e.g. REXPDouble, REXPString, RList, . . .
• Clojure の値に変換が面倒
Clojure の値 → R の式
Rserve 利用の課題
Java オブジェクト → Clojure の値
• Rserve から受けとる R 関数の実行結果
• R の型に対応する Java のクラスのオブジェクト
• e.g. REXPDouble, REXPString, RList, . . .
• Clojure の値に変換が面倒
Clojure の値 → R の式
• eval() に渡す式を組み立てる必要
Rserve 利用の課題
Java オブジェクト → Clojure の値
• Rserve から受けとる R 関数の実行結果
• R の型に対応する Java のクラスのオブジェクト
• e.g. REXPDouble, REXPString, RList, . . .
• Clojure の値に変換が面倒
Clojure の値 → R の式
• eval() に渡す式を組み立てる必要
• Clojure の値を一旦全て文字列で表現
Rserve 利用の課題
Java オブジェクト → Clojure の値
• Rserve から受けとる R 関数の実行結果
• R の型に対応する Java のクラスのオブジェクト
• e.g. REXPDouble, REXPString, RList, . . .
• Clojure の値に変換が面倒
Clojure の値 → R の式
• eval() に渡す式を組み立てる必要
• Clojure の値を一旦全て文字列で表現
• Clojure と R との表現が異なる場合は面倒
Java から Clojure へ
Protocols による解決
->clj
Protocols とは
Protocols とは
Java のインタフェースのようなもの
Protocols とは
Java のインタフェースのようなもの
• すなわち型 (Java のクラス) に基づくディスパッチ
Protocols とは
Java のインタフェースのようなもの
• すなわち型 (Java のクラス) に基づくディスパッチ
• 貧弱なディスパッチによる多態性の提供
Protocols とは
Java のインタフェースのようなもの
• すなわち型 (Java のクラス) に基づくディスパッチ
• 貧弱なディスパッチによる多態性の提供
Protocols とは
Java のインタフェースのようなもの
• すなわち型 (Java のクラス) に基づくディスパッチ
• 貧弱なディスパッチによる多態性の提供
そんな貧弱なディスパッチで大丈夫か?
Protocols とは
Java のインタフェースのようなもの
• すなわち型 (Java のクラス) に基づくディスパッチ
• 貧弱なディスパッチによる多態性の提供
そんな貧弱なディスパッチで大丈夫か?
• 「大丈夫だ、問題ない」(2 回目)
Protocols とは
Java のインタフェースのようなもの
• すなわち型 (Java のクラス) に基づくディスパッチ
• 貧弱なディスパッチによる多態性の提供
そんな貧弱なディスパッチで大丈夫か?
• 「大丈夫だ、問題ない」(2 回目)
• Java のインタフェースでも困らない
Protocols とは
Java のインタフェースのようなもの
• すなわち型 (Java のクラス) に基づくディスパッチ
• 貧弱なディスパッチによる多態性の提供
そんな貧弱なディスパッチで大丈夫か?
• 「大丈夫だ、問題ない」(2 回目)
• Java のインタフェースでも困らない
Protocols とは
Java のインタフェースのようなもの
• すなわち型 (Java のクラス) に基づくディスパッチ
• 貧弱なディスパッチによる多態性の提供
そんな貧弱なディスパッチで大丈夫か?
• 「大丈夫だ、問題ない」(2 回目)
• Java のインタフェースでも困らない
Protocols の利点
Protocols とは
Java のインタフェースのようなもの
• すなわち型 (Java のクラス) に基づくディスパッチ
• 貧弱なディスパッチによる多態性の提供
そんな貧弱なディスパッチで大丈夫か?
• 「大丈夫だ、問題ない」(2 回目)
• Java のインタフェースでも困らない
Protocols の利点
• Clojure のホスト環境 (Java) に存在する機能
Protocols とは
Java のインタフェースのようなもの
• すなわち型 (Java のクラス) に基づくディスパッチ
• 貧弱なディスパッチによる多態性の提供
そんな貧弱なディスパッチで大丈夫か?
• 「大丈夫だ、問題ない」(2 回目)
• Java のインタフェースでも困らない
Protocols の利点
• Clojure のホスト環境 (Java) に存在する機能
• 速さ
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]
Rashinban を支える技術 1
Rashinban を支える技術 1
Protocols
R <=> Clojure のデータ型を自動変換
Rashinban を支える技術 1
Protocols
R <=> Clojure のデータ型を自動変換
クライアント起動時
Rashinban を支える技術 1
Protocols
R <=> Clojure のデータ型を自動変換
クライアント起動時
1 サーバに接続 (RConnection.)
Rashinban を支える技術 1
Protocols
R <=> Clojure のデータ型を自動変換
クライアント起動時
1 サーバに接続 (RConnection.)
2 サーバから built-in 関数一覧を取得
Rashinban を支える技術 1
Protocols
R <=> Clojure のデータ型を自動変換
クライアント起動時
1 サーバに接続 (RConnection.)
2 サーバから built-in 関数一覧を取得
3 built-in 関数に相当する Clojure 関数を作成
Rashinban を支える技術 1
Protocols
R <=> Clojure のデータ型を自動変換
クライアント起動時
1 サーバに接続 (RConnection.)
2 サーバから built-in 関数一覧を取得
3 built-in 関数に相当する Clojure 関数を作成
4 search() 関数を使ってパッケージ一覧を取得
Rashinban を支える技術 1
Protocols
R <=> Clojure のデータ型を自動変換
クライアント起動時
1 サーバに接続 (RConnection.)
2 サーバから built-in 関数一覧を取得
3 built-in 関数に相当する Clojure 関数を作成
4 search() 関数を使ってパッケージ一覧を取得
5 ls() 関数を使ってパッケージ毎に利用可能な関数一覧を取得
Rashinban を支える技術 1
Protocols
R <=> Clojure のデータ型を自動変換
クライアント起動時
1 サーバに接続 (RConnection.)
2 サーバから built-in 関数一覧を取得
3 built-in 関数に相当する Clojure 関数を作成
4 search() 関数を使ってパッケージ一覧を取得
5 ls() 関数を使ってパッケージ毎に利用可能な関数一覧を取得
6 全ての R 関数に相当する Clojure 関数を作成
Checkpoint
Checkpoint
Rashinban (回らないほう)
Checkpoint
Rashinban (回らないほう)
• サーバ/クライアントで R を利用するライブラリ
• Rserve のクライアントを利用
• 起動時に R サーバに接続して利用可能関数を調べる
Checkpoint
Rashinban (回らないほう)
• サーバ/クライアントで R を利用するライブラリ
• Rserve のクライアントを利用
• 起動時に R サーバに接続して利用可能関数を調べる
Protocols
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) の型は?
配列と行列
c(1, 2, 3) の型は?
答え: double
配列と行列
c(1, 2, 3) の型は?
答え: double
> typeof(c(1, 2, 3))
[1] "double"
配列と行列
c(1, 2, 3) の型は?
答え: double
> typeof(c(1, 2, 3))
[1] "double"
R の行列 (matrix) の型は?
配列と行列
c(1, 2, 3) の型は?
答え: double
> typeof(c(1, 2, 3))
[1] "double"
R の行列 (matrix) の型は?
答え: 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 はどのようにして両者を区別するか?
属性
• R のオブジェクトは任意の属性をもつことができる
• 振舞いに影響を与える属性がある
• class, dim 属性
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 の属性値を保存

More Related Content

PDF
Ruby 3のキーワード引数について考える
PDF
型プロファイラ:抽象解釈に基づくRuby 3の静的解析
PDF
JDK 10 へようこそ
PDF
ATN No.2 Scala事始め
PDF
ScalaMatsuri 2016
PDF
Scalaで萌える関数型プログラミング[完全版]
PDF
Scalaで型クラス入門
PDF
はてなブックマーク in Scala
Ruby 3のキーワード引数について考える
型プロファイラ:抽象解釈に基づくRuby 3の静的解析
JDK 10 へようこそ
ATN No.2 Scala事始め
ScalaMatsuri 2016
Scalaで萌える関数型プログラミング[完全版]
Scalaで型クラス入門
はてなブックマーク in Scala

What's hot (20)

PDF
はてなブックマークにおけるアクセス制御 - 半環構造に基づくモデル化
PDF
磯野ー!関数型言語やろうぜー!
PDF
Material
PDF
Cookpad Summer Intern 2015 - Programming Paradigm
PDF
たのしい関数型
PDF
BOF1-Scala02.pdf
PPTX
Sns suite presentation
PDF
きつねさんと学ぶ Lambda式&StreamAPIハンズオン[関ジャバ2015/7/11] #kanjava
PPT
Rpscala2011 0601
PDF
演算子オーバーライドをDSLに活用する
PPTX
Xtend の紹介
PDF
15分でざっくり分かるScala入門
PDF
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
PDF
Brand new Data Processing - StreamAPI
PDF
なぜリアクティブは重要か #ScalaMatsuri
PDF
197x 20090704 Scalaで並行プログラミング
PPTX
Scala勉強会 初心者向けハンズオン前編
PDF
Scala2.8への移行
PPTX
今さら聞けないHadoop勉強会第2回 セントラルソフト株式会社(20120228)
PDF
Clojure
はてなブックマークにおけるアクセス制御 - 半環構造に基づくモデル化
磯野ー!関数型言語やろうぜー!
Material
Cookpad Summer Intern 2015 - Programming Paradigm
たのしい関数型
BOF1-Scala02.pdf
Sns suite presentation
きつねさんと学ぶ Lambda式&StreamAPIハンズオン[関ジャバ2015/7/11] #kanjava
Rpscala2011 0601
演算子オーバーライドをDSLに活用する
Xtend の紹介
15分でざっくり分かるScala入門
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
Brand new Data Processing - StreamAPI
なぜリアクティブは重要か #ScalaMatsuri
197x 20090704 Scalaで並行プログラミング
Scala勉強会 初心者向けハンズオン前編
Scala2.8への移行
今さら聞けないHadoop勉強会第2回 セントラルソフト株式会社(20120228)
Clojure
Ad

Viewers also liked (12)

PDF
Kobe.R #15 - Incanter チョットシッテル
PDF
Mad kobe.r14
PDF
Kobe.R #18: 本の紹介: 通称「緑本」
PDF
R6 classes
PDF
Factor型の注意点
PPTX
R in life science
PPTX
R in life science2
PDF
Packages for data wrangling データ前処理のためのパッケージ
PDF
サポートベクトルマシン入門
PDF
Rデータ処理入門
PDF
gen-class とバイトコード(第3回 gen-class 勉強会資料)
PDF
2値化CNN on FPGAでGPUとガチンコバトル(公開版)
Kobe.R #15 - Incanter チョットシッテル
Mad kobe.r14
Kobe.R #18: 本の紹介: 通称「緑本」
R6 classes
Factor型の注意点
R in life science
R in life science2
Packages for data wrangling データ前処理のためのパッケージ
サポートベクトルマシン入門
Rデータ処理入門
gen-class とバイトコード(第3回 gen-class 勉強会資料)
2値化CNN on FPGAでGPUとガチンコバトル(公開版)
Ad

Similar to Shibuya.lisp #28: 仮題: R について (20)

PDF
あまぁいRcpp生活
PDF
関数型言語テイスティング: Haskell, Scala, Clojure, Elixirを比べて味わう関数型プログラミングの旨さ
KEY
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
PDF
普通のプログラミング言語R
PPTX
統計環境R_はじめの一歩2016
PDF
Rubyの御先祖CLUのお話(原本)
PPTX
Ll tiger clojure
PDF
スタートHaskell2 型を信じろ
PDF
10分で分かるR言語入門ver2.1
PDF
関数プログラミング入門
ODP
Vim scriptとJavaとHaskell
PDF
Coq Party 20101127
PDF
10分で分かるR言語入門ver2_0906
PDF
Lisp Tutorial for Pythonista : Day 3
KEY
ODP
括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったか
KEY
Clojure programming-chapter-2
PDF
Tokyor23 doradora09
PDF
Haskell超入門 Part.1
PDF
10分で分かるr言語入門ver2.2 13 0223
あまぁいRcpp生活
関数型言語テイスティング: Haskell, Scala, Clojure, Elixirを比べて味わう関数型プログラミングの旨さ
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
普通のプログラミング言語R
統計環境R_はじめの一歩2016
Rubyの御先祖CLUのお話(原本)
Ll tiger clojure
スタートHaskell2 型を信じろ
10分で分かるR言語入門ver2.1
関数プログラミング入門
Vim scriptとJavaとHaskell
Coq Party 20101127
10分で分かるR言語入門ver2_0906
Lisp Tutorial for Pythonista : Day 3
括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったか
Clojure programming-chapter-2
Tokyor23 doradora09
Haskell超入門 Part.1
10分で分かるr言語入門ver2.2 13 0223

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