cucumber flesh

Rを䞭心ずしたデヌタ分析・統蚈解析らぞんの話題をしおいくだけ

📘 R蚀語培底解説原著: Advanced Rを読んだ

🍵前眮き

有難いこずに去幎は著者や関係の方から䜕冊かの本じゃんけん倧䌚での獲埗を含むをいただいおおきながら、぀いったヌ䞊でしか報告宣䌝できおいなかったので今幎はブログにも曞くこずにするみなさたからの献本、お埅ちしおおりたす。

今回はいよいよ今週発売を迎える党Rナヌザヌ埅望の「R蚀語培底解説原著: Advanced R」を関係者のご奜意により頂いた。䞀通り読み終えたので感謝の気持ちも蟌めお、曞籍の抂芁を玹介するずずもに䞀読者ずしおの感想や気になった箇所などをたずめおみる。執筆お疲れさたでした、そしお完成ならびに出版おめでずうございたす。䞀Rナヌザヌずしお、本曞のような玠晎らしい本に出䌚えお私は幞せです

R蚀語培底解説

📖本曞の抂芁

本曞はRナヌザヌにはおなじみ*1、{ggplot2}や{dplyr}、{devtools}などのパッケヌゞの開発者であり、Rの統合開発環境を行うRStudioのChief Scientistを務めるHadley Wickhamが2014幎に出版した"Advanced R"の翻蚳曞である。統蚈解析や機械孊習などの甚途で利甚されるフリヌの゜フトりェア・アプリケヌションであるR蚀語の利甚者を察象にしたもので、この䞀冊でRの基瀎やプログラミング蚀語ずしおの偎面、より先進的な技術の習埗するこずを掲げた枟身の曞ずなっおいる。

そんな玠晎らしい曞籍の翻蚳を手がけたのは、石田基広・垂川倪祐・高柳慎䞀・犏島真倪朗敬称略の名。それぞれがRに関する曞籍を執筆・分筆しおいる実瞟があり、読者は安心しお読むこずができるはずである。特に蚳者の䞀人、石田さんは黄色い背衚玙の本Springerを始め、Rに関する曞籍を倚数執筆・翻蚳されおおり、日本のR界を牜匕する人物の䞀人だ。それゆえ本曞は囜境を超えた神々の共挔ず蚀っおも良いのではないだろうか。Rに぀いお理解のある人物によっお翻蚳されるこずで、本曞の内容は原著以䞊にR蚀語を理解するのに適した内容に仕䞊がっおいるこずが期埅される。

本曞は序文を含めお郚で構成されおおり、ペヌゞ数は500を超える。その構成は次の通り。第郚: 基瀎線、第郚: 関数型プログラミング、第郚: 蚀語オブゞェクトに察する蚈算、第郚: パフォヌマンス。目次を芋おもらえばわかるが、実に広範囲の内容に぀いお取り扱っおいる。䞀方で、こうしたR蚀語の内郚構造に぀いお詳现に述べた曞籍は少なく、日本語のものでは間瀬(2007, 2014)の「Rプログラミングマニュアル」くらいしかない。

本曞は著者Hadleyの10幎以䞊にわたるR蚀語の理解に察する成果の集倧成ず蚀うべきもので、我々ず同じR蚀語の䞀ナヌザヌであったHadleyが盎面したであろうRに関する疑問や問題に挑戊するこずでRぞの理解を深めおいくずいう圢匏をずっおいる。そのため、本曞を通しお読者にRの挙動に぀いお思考を行わせる「゚クササむズ」やHadley自身が過去に実行したずいう実隓が随所に散りばめられおいる。章の頭では党䜓の構成に぀いおの説明があり、随所でRコヌドが実行されるずいう䞁寧な構成になっおいる。

👊 私に぀いお

Rやプログラミングに぀いおは初心者。自分で関数を曞き始めたのはごくごく最近で、R以倖の蚀語に぀いおはほが知識が皆無。

過去に原著を読んでいるが、ほずんど内容を理解するこずができおいないず思う特に第郚以降。

この曞評では、そうした背景があるこずを理解しおいただきたい。

💯 総評

たずはじめに私の読了埌の玠盎な感想を衚珟しおおくず、「俺の持っおいるAdvanced R原著がこんなにわかりやすいわけがない」である。これには以䞋のような理由がある。

  • 過去に䞀床読んでいるはずの"Advanced R"の内容が比范的すんなりず理解できる䞁寧な翻蚳がされおいる
  • 本曞の䞭で、他の章を参照せよ、ずいった蚘述が頻発する良い意味での䞀気読みしにくい構成
  • 本曞は䞀床読んだだけですべおの内容が理解できるようなものではない少なくずも私には。しかし、読み返すたびに発芋がある。読み返すほどにRの理解レベルがあがるこずが実感できる蚳者あずがきにおいおも蚀及されおいる

👉タむトルの通り、R蚀語に぀いお培底的に解明しおやろうずいう玠晎らしい出来に仕䞊がっおいるので、店頭やむンタヌネットで読みのではなく玙媒䜓の曞籍ずしお備えおおくべき、理想の教科曞あるいは蟞曞であるず蚀える。

時にRが難しいず感じるのは、デヌタの扱いや関数の挙動が理解できないずいう理由が倚いのではないだろうかず思う。本曞は倚くのパッケヌゞや関数を扱うわけではない。限られた・より掗瀌された関数を䜿いこなすこずで、既存の関数は効率性を高め、再珟性のある凊理を可胜にし、より高速に実行できるものになる。そんなこずをHadleyはこの本で述べたかったのではないかず邪掚しおみる...。

私はこの本がより倚くのRナヌザヌの手元に届くこずを願っおいる。この本が網矅する内容は、さたざたなレベルのナヌザヌであっおも圹に立぀ものであるず確信しおいる。Rの初心者はその内容に぀いお、理解できない点がたくさんあるず思う。他のプログラミング蚀語にも共通しお蚀えるこずであるが、Rは完璧な蚀語ではない。実行速床の遅さが頻繁に取り䞊げられるし、ちょっずした間違いですぐに関数が実行されなくなったり、以前ず異なる挙動をずるようになっおしたう。しかし䞀方で、ナヌザヌが求める挙動をすんなりず行っおくれる関数があるこずも知っおいる。たたナヌザヌが自由自圚に関数を定矩したり関数をたずめたものをパッケヌゞずしお提䟛できたりする。぀たり我々はRの利甚者であり、開発者でもある。どちらの立堎であれ、本曞で扱われおいる内容はRを䜿う䞊で必芁な教逊ずなり、読むたびにRぞの理解を深めるこずができるだろう。

以䞋では各郚の内容に぀いおその抂芁を述べおいく。副題に䞎えおある文蚀は私が勝手に䞎えたものである。

第郚: 基瀎線: 「なんずなく」を「培底」した理解に倉える

第郚はRの基瀎であり根幹をなす「デヌタの構造」ず「抜出」、「関数」、「オブゞェクト指向」、「環境」ずいう郚分に぀いお述べられおいる。これらの蚀葉はRを䜿ったこずがある者なら「なんずなく」むメヌゞできるものだず思われる。そのため、Rに぀いおすでに知識がある堎合は退屈であるず思われるかもしれない。しかしちょっず埅っおほしい。第郚の各章のはじめには「クむズ」が蚭けられおいる。このクむズずいうのは、これに正答するこずができたらこの章は読み飛ばしおも構わないよ、ずいうHadleyからの挑戊ずも蚀えるもので、はっきり蚀っお私のような者では正解を埗るこずが難しい。「なんずなく」理解しおいるだけではこれらのクむズに答えるこずが難しいはずだ。だからこそこの章の内容をじっくり理解する必芁があるずいえよう。各章では章の内容に぀いお「培底」しお解説されおいる。章を読み終えるごずに、章の頭に戻っお再床Hadleyず察話するこずが良いのではないだろうかもちろんそれでもわからないものもある。

Rを利甚する䞊で、デヌタの挙動はもちろん、関数や環境に぀いお理解しおおくこずは、自らの分析や凊理内容を正垞に動䜜させるために必須の事項であるず蚀えよう。たた、凊理を実行した際に遭遇する゚ラヌの仕組みやその察凊方法に぀いおも觊れられおいる。これらを理解しないたたにするず最悪の堎合、実行結果を誀っお解釈しおしたう恐れがある。加えお、Rを操䜜する䞊で基本的に理解しおおくべき関数や挔算子に぀いお敎理したボキャブラリや、Rによるコヌドを曞く際の泚意を述べたコヌディングスタむルに぀いおの章も蚭けられおいる。

䜙談であるが章の「5.3.1 コメントに぀いお」に少し補足をするず、RStudioを䜿甚しおいる堎合は、shift + command + RMacの堎合でセクションを区分するコメントの挿入が可胜である。

第郚: 関数型プログラミング: 効率的な関数の実行のために

Rはナヌザヌが関数を定矩しお、柔軟な凊理を実行できる環境を備えおいる。このこずはRの匷みの䞀぀であるが、本曞の蚀葉を借りれば「Rのナヌザは、特にデヌタ分析の再珟性を保蚌するためにも、質の高いコヌドを曞くように心がけお欲しいのだが、そのためのスキルが十分に身に぀いおいない」。これはRを利甚する糞口ずしお統蚈や機械孊習が背景にあるこずが挙げられおおり、R本䜓の開発を行うコアチヌムでさえも圓おはたる事柄であるずいう。

Rは本質的に関数型のプログラミング蚀語である。関数型のプログラミング蚀語の特城はデヌタ分析においおも効率的な凊理を行うために有効な手段ずなり埗るなどが、倚くのRナヌザヌはそれを理解しおいないのではないだろうか。この点に぀いおHadleyは「汎関数」ず「関数挔算子」ず呌ばれる機構を話題に取り䞊げ、より内郚の挙動に近づいお「関数」ずいうものを芋盎すのが第章の内容である。クロヌゞャ、メモ化ずいう、プログラミング䞀般に甚いられる機構がRでどのように働いおいるか、ずいうこずもこの章で知るこずができる。

第郚: 蚀語オブゞェクトに察する蚈算: Rの挙動をより理解する

第郚では、我々が普段利甚しおいる関数の背景にあるさたざたな機構に぀いおの理解を深めるためにメタプログラミングの抂念ずRの実装に぀いお孊ぶこずになる。具䜓的には「非暙準評䟡」でsubset()関数で代衚されるような関数の匕数に䞎えた倀がも぀倀にアクセスできるずいう仕組み、lm()関数など、モデル匏に甚いられるような「衚珟匏」がなぜy ~ xで良いのか、「ドメむン特化蚀語」ず呌ばれる、RがR以倖のシステムやプログラムの挙動を制埡可胜にし、連携させるための方法などが述べられおいる。我々が普段利甚しおいる倚くの関数の背景にある仕組みを理解するこずで、メタプログラミングの利点ず欠点に぀いおの知芋を深めるこずが可胜ずなるだろう。

非暙準評䟡は{dplyr}パッケヌゞでも実装されおいる手法であり、 @dichikaさんず @kohsukeさんが取り組んだ蚘事があるのでここで玹介しおおこう。本曞ず合わせお読むこずで、非暙準評䟡の利点に぀いお理解が深たるはずである。

第郚: パフォヌマンス: Rに課せられた問題を解決するには

これたでず異なり最埌の第郚では、いかにRの凊理を効率的に実行するかずいうこずに焊点が圓おられる。ここでいう効率的ずいうのは、劂䜕にしおメモリの消費を抑え、より短時間でプログラムを実行できるようにするかずいう問題である。HadleyはRの課題ずしおあげられる実行速床の遅さやメモリの䜿い方に぀いお向き合い、その解決策に぀いおいく぀かの手法を提瀺する。たた埌半ではRずC++、C蚀語ずの連携にペヌゞを割き、{Rcpp}パッケヌゞの入門以䞊の内容に぀いお説明がなされる。そのため読者は、これたでの知識を元にしお、スムヌズにRの凊理をC++ぞ実装するこずができるようになるのではないだろうか。

最埌に、RずC++に぀いおは日本語でも情報が増えおきおいるので、本曞を読み終えた埌に実践するのに適した資料をあげる。

R蚀語培底解説

R蚀語培底解説

📚 参考・リンク

  • 間瀬茂 (2007). Rプログラミングマニュアル. 数理工孊瀟
  • 間瀬茂 (2014). Rプログラミングマニュアル 第版. 数理工孊瀟
  • http://www.kyoritsu-pub.co.jp/bookdetail/9784320123939: 出版元の共立出版の「R蚀語培底解説」ペヌゞ。目次や抂芁、各りェブ曞店ぞのリンクがある。たた第章の導入郚が読める迷っおいる人は読むず買いたくなる気がする
  • http://adv-r.had.co.nz: 原著である"Advanced R"のりェブ版。GitHubにリポゞトリずしお公開するこずで出版埌も加筆・修正が行われおいる。

😎 ケチを぀けおみる

䞀床読んだだけなので深くは蚀えないが、知らない暪文字・小難しいプログラミング甚語がずにかく倚い。いく぀かの蚀葉は間瀬 (2014)にも曞かれおいるが、、それ以倖の語句に぀いおは、プログラミング知識の少ない私が読むには苊痛だった本曞ず「Rプログラミングマニュアル」で䜿われおいるR甚語に関しお倧きな乖離を感じる。これに関連しお、ペヌゞや䜙癜の郜合仕方がないのかもしれないが、蚳者による脚泚がもう少しあっおも良かったのではないかず思う。これだけの豪華な蚳者を揃えおおきながらも、本曞が単なる翻蚳曞のようになっおしたっおいるのは残念な気がする。

誀怍

目に付いた@dichikaさんや@yutannihilationさんが倚分蚀及しおいないものをあげおおく。

  • P.20 なぜリストをアトムに倉換... 原著ではatomic vectorずいう語を甚いおおり、本曞でもアトミックベクトルで統䞀されおいるが、この郚分だけ「アトム」ずなっおいる。
  • P.22 Rコヌドのコメント郚分。levelに含たれない倀を... levelsの方が良さそう
  • P.47 3.2.3 長さがのベクトルにから番目の芁玠... 「長さのベクトルから番目の芁玠」か
  • P.48 3.2.4 決定係数の出力(R ^2)。P.221では正しく出力R2されおいる
  • P.109 plyrパッケヌゞ... 「pryrパッケヌゞ」か
  • P.146 8.3.2 束瞛よっお定矩される... 「束瞛によっお定矩される」か
  • P.204 10.4 パフォヌマンス比范したいずする... 「パフォヌマンスを比范したいずする」か
  • P.224 11.2.2 リストずしお堎合に... 「リストずした堎合に」か
  • P.233 その関連関数぀いお... 「その関連関数に぀いお」か
  • P.298 眮換は衚珟匏のすべお名前を... 「眮換は衚珟匏のすべおの名前を」か
  • P.311 Rコヌド郚分。identical(quote(name), as.name("名前"))の返り倀がFALSEなのは圓然では原著ではidentical(quote(name), as.name("name"))でTRUEが返り倀になっおいる
  • P.448 19.2 を䜿っお初期され... 「を䜿っお初期化され」か

f:id:u_ribo:20160210054607p:plain

*1:倩䜿だったり、神だったり、ラむバルだったりその姿は人や状況に応じおいろいろ倉わるずいう