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

まだ厨二病

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

😎毎朝の習慣としてRパッケージの監視をしています

gmailr rvest hechima

タイトルに偽りあり。これからやっていこう、という話です。

Rの機能を拡張する便利なパッケージはRそのものやRのパッケージを管理するCRANに登録されています。私は、パッケージの読み込み時にパッケージがインストールされていないためにthere is no package calledと怒られるのが嫌で、Rのインストール時にCRAN登録済みの全パッケージをインストールする、みたいなことをやっているのですが、それ以降に追加登録されたパッケージについては知らないことが多く、時間も経ったのでたくさんのパッケージがインストールされていない状況になってきました。

CRANに登録されたパッケージは、CRANのウェブページから確認できます。また、更新情報を見やすくまとめてお知らせしてくれるCRANberriesも有名です。

CRANberriesではfeedを発行しているのでパッケージの更新・追加の情報を得ることができますが、私は購読していません。せっかくなので本家であるCRANの情報を元にして、パッケージの情報を得たいところです。現状として、何かしらのパッケージが毎日更新されています。なので1日一回追加されたRパッケージについての情報を取得すれば良さそうです。というわけでウェブスクレイピングによって追加登録されたパッケージをGmailで送る、という仕組みを構築します。

まずは現在インストールされているパッケージ数を確認しましょう。

# インストールされているパッケージ名のデータフレーム
installed_pkg <- installed.packages() %>% as.data.frame(stringsAsFactors = FALSE) %$% Package
# インストール済みのパッケージ数
length(installed_pkg)
## [1] 5150
library(Hmisc)
  # %in% の否定演算子 %nin% を有効にするため
library(rvest)
library(gmailr)
  # RからGmail経由でメールを送信するパッケージ
library(lubridate)
library(dplyr)

未インストールのCRANパッケージ

available.packages()関数は、CRANに登録されるRパッケージの一覧を返します。この一覧とインストール済みのパッケージを比較して、どのパッケージがインストールされていないのかを調べます。

# CRANに登録されているパッケージの一覧をデータフレームに格納
df_all_pkg <- available.packages() %>% as.data.frame(stringsAsFactors = FALSE)

2015-12-27現在、CRANには7684のパッケージが登録されています。やはりインストールされている数と結構差がありますね。

インストール済みのパッケージに含まれない、CRANに登録されているパッケージの名前のベクトルを作ります。

available_pkg <- df_all_pkg %>% dplyr::filter(Package %nin% installed_pkg) %$% Package

これらを一括でインストールするには次のコードを実行します。これでCRANに登録されていて利用可能な数とインストールされているパッケージ数に差がなくなりました。

install.packages(pkgs = available_pkg, dependencies = TRUE)

CRANのぺージからウェブスクレイピング

では以降毎日の更新を監視して追加されたパッケージを通知する、ということをやりましょう。日付ごとにまとまっているぺージスクレイピングの対象にします。

# 登録日(更新含む)の日付順に配列されたテーブルから、パッケージ情報を取得
  # .dplyr::filter()内で実行日の日付だけを抽出(lubridate::today())
df_available_list <- read_html("https://cran.r-project.org/web/packages/available_packages_by_date.html") %>% 
  html_node(., css = "table") %>% 
  html_table() %>% 
  dplyr::filter(Date == today(tzone = "UTC"))
nrow(df_available_list)
## [1] 8

このままではすでにインストールされている、更新されたパッケージも含まれているので、先ほどと同じくインストール済一覧にないものだけに絞ります。

# インストールされていない"新規"のパッケージ
df_new_pkg <- df_available_list %>% dplyr::filter(Package %nin% installed_pkg)
nrow(df_new_pkg)
## [1] 5
Date Package Title
2015-12-26 NNLM Fast and Versatile Non-Negative Matrix Factorization
2015-12-26 oasis Multiple Sclerosis Lesion Segmentation using Magnetic Resonance Imaging (MRI)
2015-12-26 ShapeSelectForest Shape Selection for Landsat Time Series of Forest Dynamics
2015-12-26 TransferEntropy The Transfer Entropy Package
2015-12-26 validateRS One-Sided Multivariate Testing Procedures for Rating Systems

インストール方法も先と同じです。

install.packages(pkgs = df_new_pkg$Package, dependencies = TRUE)

Gmailで通知する

{gmailr}というパッケージを利用して、RからGmailでメールを送ります(それだけでも素晴らしい)。利用方法はGitHubのREADMEやvignettesにもありますが、こちらがより親切な感じです。

諸々の設定を済ませてClient IDの記載されたjsonファイルを用意します。body部分もあれこれいじれば捗りそうです。

gmail_auth(secret_file = "<Client ID>.json", scope = "compose")

mime(To      = "<受信先のメールアドレス>",
     From    = "<送信先のGmailメールアドレス>",
     attr    = list(content_type = "text/html", charset = "utf-8", encoding = "base64"),
     Subject = paste0("There are new released R Packages! (", today(tzone = "UTC"), ")"),
     body    = knitr::kable(df_new_pkg, format = "html")) %>%
  send_message()

私はあとでチェックするためにEvernoteのメールアドレスに送ることにしました。このような感じでノートが作成されます。

f:id:u_ribo:20151227105843p:plain

毎朝実行する

一連のRコード(新規追加パッケージのデータフレーム作成、{gmailr}でのメール送信)を保存しておいて、これを定期的に実行するようにします。以前に書いた

uribo.hatenablog.com

のようにLaunchAgentsを書いても良かったのですが、一億総自宅サーバー構築なんちゃらを目指してscheduleRを使います。scheduleRについては、また詳しく書く予定ですが、サーバー経由でRコードやShinyアプリの定期的に実行できる、というすごい便利なものです。

f:id:u_ribo:20151227115259p:plain

Enjoy 👍

広告を非表示にする