読者です 読者をやめる 読者になる 読者になる

INPUTしたらOUTPUT!

忘れっぽいんでメモっとく

R言語徹底解説をご恵贈頂きました

R

報告が遅くなりましたが「R言語徹底解説」をご恵贈頂きました!

f:id:tak95:20160221024247p:plain:w200

ありがとうございますm(_ _)m
すでに多くの人が読了エントリ*1*2*3*4*5を書かれており、それらの書評で十分ですがようやく読み終えたので特に印象に残ったトピックを取り上げたい。


第I部 基本編

R言語を使用するようになってもうすぐ丸3年になるが基本編に記載されていることでも知らないことがまだまだ多かった。 特に7. オブジェクト指向実践ガイド、8. 環境は他のR入門書やWebにも詳しい説明が少ない(自分が知らないだけ?)のでメモしとく。


7. オブジェクト指向実践ガイド

S3の場合、メソッドは総称関数という関数に属している. 単に総称と呼ぶこともある. つまりS3のメソッドはオブジェクトやクラスには属していない. これは他のほとののプログラミング言語と異なる点ではあるが、正当なオブジェクト指向システムである.(p112)

Javaオブジェクト指向を勉強した身としてはメソッドがクラスに属していないというのは理解しにくい。がplot()やsummary()が引数のクラスによって挙動が変わるのはポリモーフィズムによるものかな?と想像していた。実際はplot()やsummary()はメソッドでもクラスでもなく総称関数という関数で、与えられたクラスによってplot.data.frame()やsummary.lm()などのメソッドが実行される仕組みになっている。これはまさにポリモーフィズムを体現している。総称関数に属するメソッドの一覧はmethods()で取得できるとのこと。


> methods(plot)
 [1] plot.acf*           plot.data.frame*    plot.decomposed.ts* plot.default       
 [5] plot.dendrogram*    plot.density*       plot.ecdf           plot.factor*       
 [9] plot.formula*       plot.function       plot.hclust*        plot.histogram*    
[13] plot.HoltWinters*   plot.isoreg*        plot.lm*            plot.medpolish*    
[17] plot.mlm*           plot.ppr*           plot.prcomp*        plot.princomp*     
[21] plot.profile.nls*   plot.raster*        plot.spec*          plot.stepfun       
[25] plot.stl*           plot.table*         plot.ts             plot.tskernel*     
[29] plot.TukeyHSD*     
see '?methods' for accessing help and source code


8. 環境

環境は変数のスコープを制御する強力なデータ構造である.(p135)

そういえばRStudioの右上にもEnvironmentというペインがありました。

f:id:tak95:20160221005456p:plain


作成したオブジェクトやロードしたライブラリなどを保持する領域と思い込んでいたが、スコープの制御や名前解決の仕組みを持つデータ構造で本章を読んでようやく@kos59125氏のR にもしかして機能を追加した話 - Docs.comのスライドの意味がわかった。またちょうど1年前のTokyo.Rでの@nakamichi氏のR6パッケージの紹介―機能と実装 の内容についても今であれば理解できる(気がする)。


第II部 関数型プログラミング

昨年Japan.Rで@sinhrks氏の{purrr} による非テーブルデータの処理 // Speaker Deckを見て関数型プログラミング(というよりpurrr)を勉強したいと思っていたので非常に参考なった。


さらにインターネット越しにダウンロードしているのであるから、サーバーへの負荷を避けるためにリクエストごとに若干の待ち時間を持たせるべきだろう. こうした挙動をforループを用いて実装すると、かなり複雑なものとなる. 一方でこの機能を追加する場合にはカウンタ機能が必要となるため、lapply()を利用することもできない.(p256)

これ、自分や。。。スクレイピングの関数を作ってURLリストにlapplyで適用しようしたけどsleepを挟むことができなかったのでforループで処理していた。関数演算子という仕組みを使うとシンプルにできるとのことなので時間があるときに試して見る。


第III部 言語オブジェクトに対する計算

13 非標準評価、 14 表現式は自分にはまだ早すぎた。。。

dplyrパッケージは、Rの式をSQLに変換するtranslate_sql()を提供する. (p339)

dplyrにそんな関数があったとは知らなかった。機械学習して構築したモデルをSQLなどの他の言語に移植したいことはあるので15 ドメイン特化言語についての考え方は参考にしたい。


第IV部 パフォーマンス

16 パフォーマンス、17 コードの最適化ではRが遅い理由やデータフレームへのアクセス方法からベクトル化、コピーの回避などパフォーマンスをチューニングする方法が細かく記載されている。IOがボトルネックでないのであれば読んでおくべき。


第IV部で一番衝撃的だったのは以下の一文。

読者がこれまでに他で目にした内容と違うかもしれないが、gc()を自分で呼び出す必要はまったくない.(p422)

な・・・なんだってーーー RjpWiki - RjpWikiの「知っているといつか役に立つ(?)関数達」に"gc() は二度繰り返すべし。"とあるので2度繰り返してた。。。表示される結果は常に同じだったので意味があるのか疑心暗鬼だったけどやはり意図的にgc()する必要はなかったのね。。。

  1. Rcppパッケージを用いたハイパフォーマンスな関数と20. RとC言語インターフェイスについては論文を読んで自分でパッケージを実装するような人にとっては他書にあまりない内容なので有用かと思う。



まとめ

正直、パッケージユーザーの域を出ない自分のレベルだと本書を読む必要性はないかな?と読む前は思い込んでいましたが

本書を通じて、読者がRの単なるユーザから能動的なプログラマに変貌を遂げる, あるいは他言語のプログラマがRに貢献しようという意欲を抱いていることに筆者は期待している

と著者が本書冒頭に記している通り単なるRユーザーこそが読むべきだと思う。


ページ数が多く分厚いため手にすることさえ躊躇してしまうかもしれないが本書は以下のような工夫が施されているため非常に読み進めやすい。

  • 各部の冒頭にアウトライン(この部ではこういうことをこの順番で理解していくみたいな)が記載されている
    • 各章のクイズ、エクササイズは読後の復習になる
  • 分からない用語・概念が出てきても後の部・章で説明されることについてはその旨が記載されている
    • 本文に記載されていなくても訳注に記載されていることも
  • Rの実行例が豊富に記載されている


Rユーザーであれば言語リファレンスとして常に手元に置いておきたい。


R言語徹底解説

R言語徹底解説


おまけ

@hoxo_m親分謹製? → R言語徹底解説クイズ

自分は60点でした。。。徹底します。