Your SlideShare is downloading. ×
普通のプログラミング言語R
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Introducing the official SlideShare app

Stunning, full-screen experience for iPhone and Android

Text the download link to your phone

Standard text messaging rates apply

普通のプログラミング言語R

6,569
views

Published on

Tsukuba.R #7

Tsukuba.R #7

Published in: Technology

0 Comments
7 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
6,569
On Slideshare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
28
Comments
0
Likes
7
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. 普通の プログラミング言語 R(仮) 2010/5/9 id:n_shuyo / @shuyo 中谷 秀洋@サイボウズ・ラボ
  • 2. 最近
  • 3. 機械学習
  • 4. いろいろ 実装してみたくて
  • 5. R始めました
  • 6. そんなわけで
  • 7. R歴
  • 8. まもなく1年
  • 9. Rって 便利ですね!
  • 10. これが E-step: 2 1 (k = argminj n − j のとき) rnk = 0 (それ以外) M-step: n rnk n k = n rnk K-means クラスタリングの更新式
  • 11. Rなら1行 mu<-t(sapply(1:K,function (k)colMeans(x[max.col( -sapply(1:K,function(i) colSums((t(x)-mu[i,])^2))) ==k,])));
  • 12. Rって ほんと便利!!
  • 13. でも……
  • 14. Rって……
  • 15. 変ですよね?
  • 16. すごいことが 簡単にできるけど
  • 17. 簡単なことが やたら難しかったり
  • 18. 予想と違う動きで ハマったり
  • 19. いままで結構いろんな言語を 触ってきたつもりだけれど── Ruby MSX-BASICX-BASIC COBOL C++ Perl ぺけBASI javascript ActionScript R PHP Excel VBA C XSLT Erlang PL/SQL JavaZ80 Brainf*ck 6502/680x Visual BASIC x86 MS-BASIC
  • 20. 気持ち悪い と思った言語は R だけ
  • 21. Rの一番良いところは 統計学者が 作っているところだ。 Rの一番悪いところは 統計学者が 作っているところだ。 [要出典]
  • 22. [出典]
  • 23. でも R だって
  • 24. 普通の プログラミング言語に なりたいはず!
  • 25. そのためには
  • 26. 「普通のプログラミング言語」 の 「普通のプログラミング」 ができるようになれば!
  • 27. もちろん
  • 28. メタプログラミング のことですね!
  • 29. Rで普通の メタプログラミング 2010/5/9 id:n_shuyo
  • 30. R って意外と
  • 31. インスペクトと 動的定義が 得意なんですよ!
  • 32. というわけで クイズです
  • 33. 次の文を実行したとき、 f は何になるでしょう? f <- function(x){x*2};
  • 34. 関数?
  • 35. 正解は「クロージャ」 > f <- function(x){x*2} > typeof(f) [1] "closure"
  • 36. 「クロージャ」って
  • 37. なんかあの 難しいやつ
  • 38. Wikipedia「クロージャ」 クロージャ(クロージャー、closure、閉 包)はプログラミング言語における関 数の一種。引数以外の変数を実行時 の環境ではなく、自身が定義された環 境(静的スコープ)において解決する ことを特徴とする。関数とそれを評価 する環境のペアであるともいえる。
  • 39. 「関数と それを評価する 環境のペア」
  • 40. たしかにクロージャ > f <- function(x){ x*2 }; > body(f) # 関数本体 { x * 2 } > environment(f) # 環境 <environment: R_GlobalEnv>
  • 41. グローバル環境 グローバル環境はワークスペースの ルートをなす .GlobalEnv がエイリアス > environment(f) <environment: R_GlobalEnv> > .GlobalEnv <environment: R_GlobalEnv>
  • 42. 環境の中身を見る ls.str(環境) もしくは as.list(環境)で 見ることが出来る > a <- 1 > ls.str(.GlobalEnv) a : num 1 f : function(x) > as.list(.GlobalEnv) $a [1] 1 $f function(x){x*2}
  • 43. 関数は子環境を作る > f <- function(x) { + print(environment()); + print(parent.env(environment())); + print(as.list(environment())); + } > f(3) <environment: 0x064bd8f0> # 子環境 <environment: R_GlobalEnv> # 親環境 $x # 子環境の中身 [1] 3 # ←3が出る仕組みは別の長い話
  • 44. 子環境は毎回作られる 関数は呼び出されるごとに子環境を 作成する(スコープの話はしません) > f <- function() { + print(environment()); + } > f() <environment: 0x06dbdd54> # 子環境1 > f() <environment: 0x06ca9c28> # 子環境2
  • 45. クロージャは環境とひもづく 定義されたときの環境を「閉包」 > f <- function() { + print(environment()); + function() {} + } > g <- f() <environment: 0x061d5cb4> # f の子環境 > environment(g) # || <environment: 0x061d5cb4> # g の環境
  • 46. クロージャの環境の中身 > f <- function() { + x <- 3 + function(a){ a * x } # 環境を閉包 + } > g <- f() > g function(a){ a * x } # x って何? <environment: 0x06dbe0b8> # この中を見れば… > ls.str(environment(g)) x : num 3 # g の環境では x <- 3 > g(2) [1] 6 # つまり g は値を3倍する関数
  • 47. 準備完了
  • 48. クロージャを いじってみよう!
  • 49. クロージャの環境は 外からいじれる > as.list(environment(g)) $x [1] 3 > environment(g)$x <- 4 # 書き換え! > ls.str(environment(g)) x : num 4 > g(2) [1] 8 # 値を4倍する関数に変わった!
  • 50. 環境のまるごと差し替え new.env() で新しい環境を作成し、 クロージャの環境に差し替える > e <- new.env() # 環境の作成 > e$x <- 5 # 値をセット > environment(g) <- e # 差し替え > ls.str(environment(g)) # 環境を確認 x : num 5 > g(3) [1] 15 # 値を5倍する関数に!
  • 51. 関数本体も差し替え! > g function(a){ a * x } # 掛け算する関数 <environment: 0x06dbe0b8> > body(g) <- expression({ a + x }) > g function (a) { a + x # 足し算する関数になった! } <environment: 0x06dbe0b8> > g(1) [1] 6 # 5を足す関数に変わった
  • 52. 引数だっていじれる! > formals(g) $a # 引数 a を持つ。デフォルト値なし > formals(g)$a <- 2 > formals(g) $a [1] 2 # 引数 a のデフォルト値が 2 に > g() [1] 7 # 2 + 5
  • 53. 結論
  • 54. Rかわいいよ!
  • 55. え?
  • 56. 「それが なんの役に 立つの?」
  • 57. ……
  • 58. ……えーと、
  • 59. こんな感じで 「R の中身」が わかってくると
  • 60. R で「できること」と 「できないこと」が
  • 61. わかるように なるかもね!(棒読み)
  • 62. ま、
  • 63. 役に立つか なんて
  • 64. 一番つまんない 尺度ですよね!
  • 65. [没ネタ集]
  • 66. 「Rで変なコードを書こう!」とか 遅延評価ってわかりにくいよね。 > a [1] 0 > g <- f(a<-3) # f は「とある関数」 > a [1] 0 # a は 0 のまま > g() # でも g() を呼ぶと…… > a [1] 3 # 3 に変わる
  • 67. 「なんでエラーなの?」とか なぜか plot できない! しかもエラーメッセージが意味不明 (わかる人にはわかるけど、 わかる人はこんなコード書かない) > plot(function(x) x+x^2); # 問題なし > f <- function(x) c(x,x^2); > plot(function(x) sum(f(x))) 以下にエラー xy.coords(x, y, xlabel, ylabel, log) : 'x' and 'y' lengths differ # 何このエラー?
  • 68. 「なんでエラーじゃないの?」とか 「なんでそんな書き方出来るの? 文法どうなってんの?」って 思うことありません? > f(abc) # f は「よくある関数」 以下にエラー f(abc) : オブジェクト 'abc' がありません > g(abc) # g は「とある関数」 > # あれ? エラーにならない……
  • 69. 「あるある~」小ネタとか plot() の重ね描きで、同じ引数を何 度も書かなくて済む方法ないの? plot(data1, xlim=c(-5,5), ylim=c(-5,5), ann=F); par(new=T); plot(data2, xlim=c(-5,5), ylim=c(-5,5), ann=F); par(new=T); plot(data3, xlim=c(-5,5), ylim=c(-5,5), ann=F);
  • 70. などなど
  • 71. ほかにも
  • 72. いろいろ
  • 73. なくもなかったん ですけど
  • 74. 時間ないので またの機会(あるかな?)
  • 75. ありがとう ございました。