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

7,960 views

Published on

Tsukuba.R #7

Published in: Technology
0 Comments
8 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
7,960
On SlideShare
0
From Embeds
0
Number of Embeds
686
Actions
Shares
0
Downloads
33
Comments
0
Likes
8
Embeds 0
No embeds

No notes for slide

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

  1. 1. 普通の プログラミング言語 R(仮) 2010/5/9 id:n_shuyo / @shuyo 中谷 秀洋@サイボウズ・ラボ
  2. 2. 最近
  3. 3. 機械学習
  4. 4. いろいろ 実装してみたくて
  5. 5. R始めました
  6. 6. そんなわけで
  7. 7. R歴
  8. 8. まもなく1年
  9. 9. Rって 便利ですね!
  10. 10. これが E-step: 2 1 (k = argminj n − j のとき) rnk = 0 (それ以外) M-step: n rnk n k = n rnk K-means クラスタリングの更新式
  11. 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. 12. Rって ほんと便利!!
  13. 13. でも……
  14. 14. Rって……
  15. 15. 変ですよね?
  16. 16. すごいことが 簡単にできるけど
  17. 17. 簡単なことが やたら難しかったり
  18. 18. 予想と違う動きで ハマったり
  19. 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. 20. 気持ち悪い と思った言語は R だけ
  21. 21. Rの一番良いところは 統計学者が 作っているところだ。 Rの一番悪いところは 統計学者が 作っているところだ。 [要出典]
  22. 22. [出典]
  23. 23. でも R だって
  24. 24. 普通の プログラミング言語に なりたいはず!
  25. 25. そのためには
  26. 26. 「普通のプログラミング言語」 の 「普通のプログラミング」 ができるようになれば!
  27. 27. もちろん
  28. 28. メタプログラミング のことですね!
  29. 29. Rで普通の メタプログラミング 2010/5/9 id:n_shuyo
  30. 30. R って意外と
  31. 31. インスペクトと 動的定義が 得意なんですよ!
  32. 32. というわけで クイズです
  33. 33. 次の文を実行したとき、 f は何になるでしょう? f - function(x){x*2};
  34. 34. 関数?
  35. 35. 正解は「クロージャ」 f - function(x){x*2} typeof(f) [1] closure
  36. 36. 「クロージャ」って
  37. 37. なんかあの 難しいやつ
  38. 38. Wikipedia「クロージャ」 クロージャ(クロージャー、closure、閉 包)はプログラミング言語における関 数の一種。引数以外の変数を実行時 の環境ではなく、自身が定義された環 境(静的スコープ)において解決する ことを特徴とする。関数とそれを評価 する環境のペアであるともいえる。
  39. 39. 「関数と それを評価する 環境のペア」
  40. 40. たしかにクロージャ f - function(x){ x*2 }; body(f) # 関数本体 { x * 2 } environment(f) # 環境 environment: R_GlobalEnv
  41. 41. グローバル環境 グローバル環境はワークスペースの ルートをなす .GlobalEnv がエイリアス environment(f) environment: R_GlobalEnv .GlobalEnv environment: R_GlobalEnv
  42. 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. 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. 44. 子環境は毎回作られる 関数は呼び出されるごとに子環境を 作成する(スコープの話はしません) f - function() { + print(environment()); + } f() environment: 0x06dbdd54 # 子環境1 f() environment: 0x06ca9c28 # 子環境2
  45. 45. クロージャは環境とひもづく 定義されたときの環境を「閉包」 f - function() { + print(environment()); + function() {} + } g - f() environment: 0x061d5cb4 # f の子環境 environment(g) # || environment: 0x061d5cb4 # g の環境
  46. 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. 47. 準備完了
  48. 48. クロージャを いじってみよう!
  49. 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. 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. 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. 52. 引数だっていじれる! formals(g) $a # 引数 a を持つ。デフォルト値なし formals(g)$a - 2 formals(g) $a [1] 2 # 引数 a のデフォルト値が 2 に g() [1] 7 # 2 + 5
  53. 53. 結論
  54. 54. Rかわいいよ!
  55. 55. え?
  56. 56. 「それが なんの役に 立つの?」
  57. 57. ……
  58. 58. ……えーと、
  59. 59. こんな感じで 「R の中身」が わかってくると
  60. 60. R で「できること」と 「できないこと」が
  61. 61. わかるように なるかもね!(棒読み)
  62. 62. ま、
  63. 63. 役に立つか なんて
  64. 64. 一番つまんない 尺度ですよね!
  65. 65. [没ネタ集]
  66. 66. 「Rで変なコードを書こう!」とか 遅延評価ってわかりにくいよね。 a [1] 0 g - f(a-3) # f は「とある関数」 a [1] 0 # a は 0 のまま g() # でも g() を呼ぶと…… a [1] 3 # 3 に変わる
  67. 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. 68. 「なんでエラーじゃないの?」とか 「なんでそんな書き方出来るの? 文法どうなってんの?」って 思うことありません? f(abc) # f は「よくある関数」 以下にエラー f(abc) : オブジェクト 'abc' がありません g(abc) # g は「とある関数」 # あれ? エラーにならない……
  69. 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. 70. などなど
  71. 71. ほかにも
  72. 72. いろいろ
  73. 73. なくもなかったん ですけど
  74. 74. 時間ないので またの機会(あるかな?)
  75. 75. ありがとう ございました。

×