まだ厨二病

RとPyhtonを使ったデータ分析・統計解析らへんの話題をしていくだけ

Rの話をしよう(深く、緩く、熱く)

先日開催されたTokyo.R#58でこんな話をした。

Rについて話すラジオ、正しくはPodcastをやりたい。

それについて経緯と詳細を書いてみる。

背景

プログラミングやデータ分析なんかは、基本的に孤独な作業なのかもしれない。しかし時々自分のやったことの評価とか、最近の話題について話せる関係があると嬉しい。職場や身近な所にそういう人物がいると良いが、Rの場合少ない、あるいは全くいないという話をしばしば耳にする。実際自分も職場ではRについて話せる人はいない。TwitterやSlackのチームであるr-wakalangは、そういうRの話をするのに適した場所であるが、サービスの性質上どうしても深い話ができなかったり、流動的なところがある(r-wakalangは雑すぎたという印象)。

各地のRコミュニティに目を向けても、日本でもっとも参加者が多いであろうTokyo.Rでも参加者のメンツは回が変わればガラリと変わるし、参加できるかどうかはスケジュールと申し込み枠の大きさと時間に依存してしまう。加えて、関東在住でなければ毎回参加することは厳しい(Tokyo.Rには遠方からの参加者が毎回何人かいる印象。それだけの価値を見出しているのだろう)。

自分自身がそうだったのだけど、Rユーザーは、Rについての話をきちんとしたいと考えている人が割といるのではないだろうか。また、Rを知らない人間にとっては、身近にRユーザがいない為にRがどんな言語なのか、どういう人たちがやっているのかというのをなかなか掴みにくいのではないかと思っている。「R、統計解析に強い言語だよね」その程度。Tokyo.Rが人気なコミュニティである理由も、そんな背景が絡んでいるのではないか。Tokyo.Rに行けば実際にRユーザと直接会って話をすることができる。

私は、Rユーザーがどうやって実務でRをどう利用しているのかとか、どんなパッケージを使っているのかとか、聞きたいことがたくさんある。それに、自分の得たRの話題を一緒に話したいという願望ももっている。情報発信はこのブログやQiita、Twitterで勝手にやっておけば良いのだけど、やはり人間相手に話をしたい時がある。そこで公な理由でRの話ができる環境として「ラジオ」という発想に至った。

rebuild.fmをはじめとして、テック系のpodcastを聞いていたせいか、ラジオやりたいなという気持ちは以前からあった。そして去年の10月に始まった「yatteiki.fm」の登場もあり、気持ちを高めていた(一人で)。

ラジオなら、場所も時間も選ばない。Skypeで通話すれば東京と広島だって距離を感じないし、札幌のRユーザとも話すことができる。いわばフリースタイルラップのような(?)自宅.Rと言える。勝手な決めつけであるが、地方のRユーザはおそらく東京のRユーザよりも孤独だ(物理的な距離で)。身近にいるホクソエムや遠方のRユーザと深く、緩く、熱く、Rについて語れる場があると良いなと思った次第である。

内容(仮)

  1. 最新のR界隈情報共有(雑談)
  2. Rとの付き合い方
  3. 分析手法、簡単なレクチャー(現場での利用)
  4. パッケージ開発ノウハウ、自作パッケージの宣伝
  5. R関連書籍の著者へのインタビュー

1 最新のR界隈情報共有

私はTwitterあるいはGitHub経由でRについての情報を得ているが、そこでは毎日のように 魅力的なパッケージ、個性的なビジュアライズ、明快な分析手法などが発信されている。到底一人の人間が全てを把握することはできない。Rについての最新の話題をまとめるR WeeklyやRStudioのブログなどがあるが、これらは海外のものなので、これらを元に情報交換をするのは互いに有益だろう。

また、Rについて記事を書いている人なら、その話題を取り上げて背景とか関数についての知見を聞くことができる。

2 Rとの付き合い方

人に歴史あり。私は人の経歴を聞くのが好きだ。その人がどうしてRと出会ったのか、どうしてRを使うのか、どうやってRを使っているのかという話を深掘りしたい。

3 分析手法、簡単なレクチャー

Tokyo.Rの応用枠のようなもの。発表というほど敷居の高いものではなくて、簡単に。

4 パッケージ開発ノウハウ、自作パッケージの宣伝

これは特に表に出ることは少ない話題であるが、パッケージ開発者にとっては需要のある内容だと思う。また、数は少ないが日本人でもパッケージを開発している人はいるのでそのパッケージの宣伝なんかにも使ってもらっても良い。

5 R関連書籍の著者へのインタビュー

気がつくとその辺にいるRユーザかつR関連の著者を捕まえて話を聞きたい。

やり方

ごくごく普通のpodcastとしてSoundCloudiTunesで配信することを検討している。

近場にいれば直接対面して話ができるが、距離の離れた人や家庭をもつ人なんかはSkypeで通話・録音するので良いと思う。出演者にはSlack・Twitter上でやりとりをする。Slackにスレッドを立てれば、リアルタイムで出演者に対する質問が集められるかもしれない。

今後の課題

  • 出演声かけ... 誰か〜
  • 機材購入... 何かと入り用
  • 段取りの把握・整備
  • テスト

大事なこと

Rユーザが場所を問わず議論できる環境さえあれば良いので、実際は私がやる必要はない。色々な人がそれぞれでやってくれるというのが理想かもしれない。また、ラジオを聞いた人が今度はRの話題をネットやコミュニティで発表するようになるというのが私の希望である。

当方Vo.希望、バンドメンバー求む。くらいな感じの勢い。

Rmdファイルで日報を書くためのタイムスタンプアドインを書いた

作ったというほど大したものではないが、RStudioアドインの普及のために書いておく。

へーしゃのエンジニアチームでは毎日やったことやぎょーむ進捗を「日報」としてSlackにあげることになっている。そこで自分は1日の終わりに今日1日の作業を思い出すのは辛いし時間の無駄でもあるので、メインで使用しているRStudioのタブの一つを日報ファイルとして使っている(ぎょーむ中の90%以上はRStudioを開いているんじゃないだろうか)。このタブの一つにRMarkdownファイルを開いといて(毎日新しいファイルを作るのも手間、乱雑になるので週ごとに分けてる)終業時にKnitして吐かれたmarkdownをSlackにあげてシュッと帰る。

insert_timestamp <- function() {
  rstudioapi::insertText(paste(paste0('`r remoji::emoji(paste0("clock",',  format(Sys.time(), "%I") %>% as.numeric(), '))`'), format(Sys.time(), "%H:%M")))
}

このファイルには作業内容はもちろん、雑な思いつきや試行錯誤の記録を残すようにしている(これらはSlackにはあげないんだけど...チラシの裏感がすごくて知見として共有する日報には相応しくなさそう、という理由から自粛してる)。その時に割と大事というか意識しているのが時間の記録で、この日の午前中にやったこととかどれくらい時間がかかったとか記録するようにしている。

Rではタイムスタンプを挿入する方法としてtimestamp()関数があるけど、コンソールに時間を出力するだけでファイルには記録できなくてダメだった(コピペすれば良いんだけどそれなら手打ちで時間を入力した方が良さげ)。

# 標準関数のタイムスタンプ
timestamp()

絵文字おじさんなので{remoji}パッケージと組み合わせて現在の時間を示す時計の絵文字が出力されるようになっている。使ってみるとこんな感じになる。ギョーム内容とは全く関係ない適当に作ったダミーテキスト。

f:id:u_ribo:20170122174812p:plain

アドインにもキーボードショートカットを割り振れるので、ささっとタイムスタンプが押せて良い。自分と同じようにRMarkdownで日報や日記を書いている人がいたらオススメしたい。

ついでに、完了したぜ!みたいなギョームには✔️チェックマークをつけておくとやっている感が自分・他人にも伝わりやすい。でも{remoji}エイリアス忘れがちなのでこれも関数化した。

さらについでに日報のフォーマットが決まっているなら、テンプレート化しておくとRMarkdownの新規作成から生成できて良さげ。{slackr}と組み合わせれば投稿まで関数化できると思うのだけど、そこまではやっていない(上記の通り、チラシの裏コメントの検閲が入るため)。

Enjoy!

⚡️関数の実行結果を知らせる関数(パッケージ)を作っています

source()でガーッとコードを実行させる時やforeach::foreach()などでループ処理をする時、モデリングのような処理に時間のかかる関数を実行すると、終わったかな、まだやっているかなとチラチラとコンソールを確認するのが結構面倒臭い。せっかちなので頻繁に見てしまう。そんな私のための、関数の実行が終了したら通知する関数を書きました。パッケージとしてGitHubに公開しているので、後述の方法でインストールすれば利用可能です。

まずはこちらをご覧ください。

f:id:u_ribo:20170114083229g:plain

このgifは下記のコードの実行結果を記録したものです。

library(roracle)
notice_status(head(iris))

head(iris) %>% notice_status(msg = "実行完了")

notice_status(warning("警告の際には出力が変更されます"))
notice_status(print(エラーとなるコードを実行するとそれを通知します))


notice_overtime(1 + 1)
notice_overtime(for(i in 1:1e7) sqrt(1:10)) 

インストール

{roracle}というパッケージを利用することで上のような通知が可能になります。下記のコードを実行すればGitHubからインストールされます(さっきGitHubにあげたのでGepuro Task Viewsに登録されていないはず)。

github.com

install.packages("devtools")
install_github("uribo/roracle")

通知のためにnotiというツールをインストールしておく必要があります。これが{roracle}の味噌となります(つまり私自身は大したことをしていない!!)

github.com

notiはOSを問わずに利用できます。

使い方

{roracle}の関数を紹介します。といっても、現在は2つの関数しかありません。コードの実行結果を通知するnotice_status()と処理時間の長いコードの終了を知らせるnotice_overtime()です。

それぞれ詳しく見ていきます。

notice_status()では、第一引数に与えたコードが実行されると通知をします。%>%によるパイプ処理をしても良いです。msgという引数を持っていて、これを変更すると通知のメッセージを変えられます。またそのうち音声読み上げさせたいと思っています。

また先の例のように、コード実行結果にWarningやMessage、Errorがあった場合にはその旨を通知します。

notice_status(head(iris))

notice_overtime()は実行時間が規定以上になったものに対して、実行完了時に通知を行います。s処理時間の長い関数の実行に追加しておくと、終了したことを確認できて捗ります。

これで一つの画面を見続けている必要がなくなりました。

Enjoy!

この関数を書いた背景として以前の記事があります。

uribo.hatenablog.com

uribo.hatenablog.com

ただこれだとMacでしか動かなかったり、パッケージ化されていないので使いにくい、ということがありました。個人的には満足できるものができたと思います。CRANにあげる気はありません。関数を使わず、もっと自然に通知させたいなと思っていますが、それはまた今度。

また、同様のことをしようとしている人がいます。metacranおじさん(Mango Solutionsの人)もなかなかの変態です。いつもありがとう!!