090724 tokyor

40
R Language Definition案内 ~Rでハマったときのために~ 第7回R勉強会 2010/07/24 (t)yatsuta

Transcript of 090724 tokyor

R Language Definition案内~Rでハマったときのために~

第7回R勉強会2010/07/24

(t)yatsuta

R Language Definition案内~Rでハマったときのために~

第1回?なぜ関数型言語で

C-likeな文法が実現できるのか

第7回R勉強会2010/07/24

(t)yatsuta

自己紹介

● id:(t)yatsuta● Twitter: http://twitter.com/tyatsuta● Hatena: http://d.hatena.ne.jp/yatsuta/

● 使用経験言語● 仕事で: C++, Perl, Ruby, Python, Java, R● 趣味で: Scheme, Common Lisp, Haskell, Erlang

● Rでの経験● LOOを用いて分類器のパラメータを最適化

– Rのライブラリでは分類器ごとにインターフェイスが異なるand補助的な情報が得られないので、自分でコードを書く必要があった

Rとは?

Rとは?

● C-likeな文法

Rとは?

● C-likeな文法● APL-likeな配列(ベクトル、行列…)演算、indexing

Rとは?

● C-likeな文法● APL-likeな配列(ベクトル、行列…)演算、indexing● CLOS-likeなオブジェクト指向

Rとは?

● C-likeな文法● APL-likeな配列(ベクトル、行列…)演算、indexing● CLOS-likeなオブジェクト指向● Scheme-likeなレキシカルスコープ

Rとは?

● C-likeな文法● APL-likeな配列(ベクトル、行列…)演算、indexing● CLOS-likeなオブジェクト指向● Scheme-likeなレキシカルスコープ● (メモ化付き)遅延引数をとる関数

Rとは?

● C-likeな文法● APL-likeな配列(ベクトル、行列…)演算、indexing● CLOS-likeなオブジェクト指向● Scheme-likeなレキシカルスコープ● (メモ化付き)遅延引数をとる関数

を有するLisp

Rとは?

● C-likeな文法● APL-likeな配列(ベクトル、行列…)演算、indexing● CLOS-likeなオブジェクト指向● Scheme-likeなレキシカルスコープ● (メモ化付き)遅延引数をとる関数

を有するLisp-likeな関数型言語

本日のテーマ

● C-likeな文法● APL-likeな配列(ベクトル、行列…)演算、indexing● CLOS-likeなオブジェクト指向● Scheme-likeなレキシカルスコープ● (メモ化付き)遅延引数をとる関数

を有するLisp-likeな関数型言語

その前にちょっとだけ…

APLとは?

APLとは?

APL(エーピーエル)は、コンピュータのプログラミング言語の一種で、1957年のケネス・アイバーソンによる創案に基づいた独特の表記法を用いた、対話型インタープリター言語である。とくに配列処理に優れる。「APL」とは、「Aプログラミング言語」(A Programming Language) の略であるが、言語の特性から、ときに「配列処理言語」(Array Processing Language) と言い換えられる。

(http://ja.wikipedia.org/wiki/APL)

APLとは?

聞くところによると会計や統計処理の分野では並ぶもののない生産性を実現し、ファンも多かったということです。しかし、同時にこの特殊文字による簡潔さは APL プログラムの読解を困難なものとして、APL のいわば「元祖 write-only 言語」としての地位を不動のものとしました。

(「Rubyist のための他言語探訪 【第 12 回】 APL と J」

http://jp.rubyist.net/magazine/?0019-Legwork)

APLとは?

モルガンスタンレーとかソロモンブラザーズ、メリルリンチ、UBSなどの投資銀行がAPLをバリバリ使っていて(というかAPL以外の言語はロケットサイエンティストにとってはマイナーだったらしい)、高等な統計処理?や行列演算?とか角度とかを駆使して株式や債券を自己勘定で売買し、ものすごい金額を荒稼ぎしていたとのことです。

(「もしかして史上もっとも稼いだ言語、APL」

http://d.hatena.ne.jp/kazunori_279/20090607/1244367469)

(ロケットサイエンティストとは?)

ロケット工学を専門とする科学者。「頭の良い人」の代名詞としても使われる。

冷戦終結とほぼ同時期に、NASAなどから多くの科学者がウォール街に流れ込み、金融工学の基礎を築いた。こういった科学者達は、元々の専門分野に構わず一緒くたに「ロケットサイエンティスト」と呼ばれることがあった。

(http://d.hatena.ne.jp/keyword/%A5%ED%A5%B1%A5%C3%A5%C8%A5%B5%A5%A4%A5%A8%A5%F3%A5%C6%A5%A3%A5%B9%A5%C8)

APLとは?

● でも、APLという言語そのものがボトルネックとなって巨額の損失を生み出す間接的な要因になってしまった

● どうやらキースさん*がUBSをAPL漬けにしたことが、UBSの巨額損失とその後の合併の遠因となったらしい● *元モルガンスタンレーのキース・アイバーソンさん(APLの発明者の息子)

(「もしかして史上もっとも稼いだ言語、APL」

http://d.hatena.ne.jp/kazunori_279/20090607/1244367469)

APLとは?

(「もしかして史上もっとも稼いだ言語、APL」

http://d.hatena.ne.jp/kazunori_279/20090607/1244367469)

APLによる配列処理

1 2 3 + 4 5 6 NB. 要素同士の加算になる

5 7 9

1 + 3 4 5 NB. 要素数を揃えてから加算する

4 5 6

1 2 3 4 > 2 NB. 真の時 1、偽の時 0

0 0 1 1

x =: 1 2 3 4 NB. =: で代入する

+ / x > 2 NB. 2 より大きい要素がいくつあるか

2

(「Rubyist のための他言語探訪 【第 12 回】 APL と J」

http://jp.rubyist.net/magazine/?0019-Legwork)

APLによる配列処理

1 2 = 1 2 NB. 要素同士の比較

1 1

+ / x = x NB. 要素の数 (宿題: なぜそうなるか)

4

# x NB. 配列の長さを求める演算子

4

(「Rubyist のための他言語探訪 【第 12 回】 APL と J」

http://jp.rubyist.net/magazine/?0019-Legwork)

APLによる配列処理

● 「APL言語入門」

● “このページの内容の引用や転載はお断りします。リンクは自由に張っていただいて結構です。”– ということなので、この場では内容をご紹介できませんが、Rの

ベクトル(行列)演算、インデクシングの理解に非常に役立つので、ぜひご覧ください。

● http://homepage3.nifty.com/ysaigusa/jp/apl/guide/intro/index.html

関数型言語Rなぜ関数型言語で

C-likeな文法が実現できるのか

関数型言語R

● そもそも「関数型」って何?● 定義は人によって異なる● プログラムの基本構造は関数定義と関数呼び出し

– 通常、for, whileなどのループ構文は使用せず、再帰を使用● 関数はファーストクラスオブジェクト

– 変数に代入したり、別の関数の引数として渡すことができる● 副作用は嫌われる(程度の差はある)

– 変数への値の(再)代入– 入出力

関数型言語R

● Rはどのくらい「関数型」?● Schemeと同程度?スペシャル関数周りがより関数的● プログラムの基本構造は関数定義と関数呼び出し

– 通常、for, whileなどのループ構文は使用せず、再帰を使用● 関数はファーストクラスオブジェクト

– 変数に代入したり、別の関数の引数として渡すことができる● 副作用は嫌われる(程度の差はある)

– 変数への値の(再)代入– 入出力

バリバリに使用する

関数型言語R

ループ構文あるじゃないか!

> x <- 5> while(x > 0) {+ if (x %% 2 == 0) print("even") else print(x)+ x <- x - 1+ }[1] 5[1] "even"[1] 3[1] "even"[1] 1

(§3.2.2)

話の都合上、ちょっと寄り道

Rの関数について

Rの関数は3種類

● “closure”(§2、§2.1.5、§4)● a function● Rで書かれた関数● 定義された環境にアクセスできる● 引数は遅延評価される

● “builtin”(§2、§2.1.7、§7.3)● an internal function that evaluates its arguments

● “special”(§2、§2.1.7、§7.3)● an internal function that does not evaluate its

arguments

オペレータは関数(§3.1.4)

● Except for the syntax, there is no difference between applying an operator and calling a function.● x + y は `+`(x, y)と書ける

– > `+`(1, 2)– [1] 3

● “+”(x, y)とも書ける!(§10.4.1)

– > "+"(1, 2)– [1] 3

オペレータは関数(§3.1.4)

> `+`

function (e1, e2) .Primitive("+")

> typeof(`+`)

[1] "builtin"

● `+`はビルトイン関数● 引数は評価されてから内部関数に渡される

オペレータは関数(§3.1.4)

Assignオペレータ(<-)も関数

> `<-`(x, 1)> x[1] 1> `<-`.Primitive("<-")> typeof(`<-`)[1] "special"

オペレータは関数(§3.1.4)

● `<-`では第一引数(左辺)が評価されたら困る● `<-`(x, 1), x <- 1などの式では、xを評価せず、

そのままxという名前(シンボル)として扱いたい

● `<-`はスペシャル関数● スペシャル関数では、引数を評価しないで、その

まま内部関数に渡すことができる

制御構造も関数(§10.4.5)

● R contains the following control structures as special syntactic constructs● if ( cond ) expr● if ( cond ) expr1 else expr2● while ( cond ) expr● repeat expr● for ( var in list ) expr

制御構造も関数(§10.4.5)

● Internally, the constructs are stored as function calls:● "if"(cond, expr)● "if"(cond, expr1, expr2)● "while"(cond, expr)● "repeat"(expr)● "for"(var, list, expr)● "break"()● "next"()

関数型言語R again

関数型言語R again

> x <- 5

> while (x > 0) {

+ if (x %% 2 == 0) print("even") else print(x)

+ x <- x - 1

+ }

[1] 5

[1] "even"

[1] 3

[1] "even"

[1] 1

すべて関数呼び出しで書き換えることができる

関数型言語R again

> `<-`(x, 5)

> `while`(`>`(x, 0), `{`(

+ `if`(`==`(`%%`(x, 2), 0), print("even"), print(x)),

+ `<-`(x, `-`(x, 1))))

[1] 5

[1] "even"

[1] 3

[1] "even"

[1] 1

さらに`foo`(x, y, ...)を(foo x y ...)と書き換えると…

関数型言語R again

(<- x 5)

(while (> x 0)

({

(if (== (%% x 2) 0)

(print "even")

(print x))

(<- x (- x 1)))どう見てもLispです本当にありがとうございました

C-like文法実現方法まとめ

R

ソース

字句解析器

構文解析器

評価器

文字

単語

(トークン)

関数呼び出し

オブジェクト

§2.1.3§10.1.2

C-like Lisp-like

参考文献