cucumber flesh

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

😎毎朝の習慣ずしおRパッケヌゞの監芖をしおいたす

タむトルに停りあり。これからやっおいこう、ずいう話です。

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 👍