若者の深刻なCRAN離れ、それを加速させるパッケージdrat

Dirkのこれ。試してみました。

http://dirk.eddelbuettel.com/blog/2015/02/05/

要は、devtools::install_github()はめっちゃ便利だけど、update.packages()で自動アップデートできない。できるようにするパッケージつくりましたよ、という話らしいです。

使い方

まずdratをインストールします。CRANに上がっているdratパッケージのバージョンは0.0.1です。

install.packages(drat)

packageVersion(drat)
#> [1] ‘0.0.1’

次に、dratでアップデートを追いかけたいユーザ名・レポジトリを登録します。

library(drat)
addRepo("eddelbuettel")

すると、あら不思議、update.packages()でCRANに登録されているより上のバージョンが入ります。

update.packages()
#> drat :
#>  Version 0.0.1 installed in /home/vagrant/R/x86_64-pc-linux-gnu-library/3.1
#>  Version 0.0.1.1 available at http://eddelbuettel.github.io/drat
#> Update (y/N/c)?  y
#> trying URL 'http://eddelbuettel.github.io/drat/src/contrib/drat_0.0.1.1.tar.gz'
#> Content type 'application/octet-stream' length 5829 bytes
#> opened URL
...snip...

packageVersion(drat)
#> [1] ‘0.0.1.1’

仕組み

なぜこんなことができるかというと、Github PagesにCRANと同じ形式のパッケージのインデックスを置いて、それをレポジトリとして認識させているからです。こんな感じです。

drat/src/contrib at gh-pages · eddelbuettel/drat · GitHub

ちなみに、場所はGithubに限らずどこでもいいので、公式の解説にもあるようにローカルサーバに置くことももちろんできます。その場合は、2つ目の引数でレポジトリの場所を指定します。

addRepo("localRepo", "http://localServer.localNet/work/R/drat")

やってみる

まずeddelbuettel/dratをフォークするか、同名のレポジトリをつくってgh-pagesブランチをつくります。ちなみに、よく分かりませんが、フォークした時点でgh-pagesブランチがあってもGithub Pagesは生成されないようです。なにかpushするとすぐできるのでご安心を。

次に、登録するパッケージを用意します。ここでは仮にsugoiPkgとします。

$ R CMD build /path/to/sugoiPkg
* checking for file ‘sugoiPkg/DESCRIPTION’ ... OK
* preparing ‘sugoiPkg’:
* checking DESCRIPTION meta-information ... OK
* checking for LF line-endings in source and make files
* checking for empty or unneeded directories
* building ‘sugoiPkg_0.0.1.tar.gz’

このsugoiPkg_0.0.1.tar.gzをdratに登録します。登録するのにはinsertを使います。(rはlittlerです)

$ cd /path/to/drat
$ git checkout gh-pages
$ mkdir -p src/contrib    # フォークせずにゼロから作った場合はディレクトリを作成する
$ r -e 'drat:::insert("/path/to/sugoiPkg_0.0.1.tar.gz", "./")'

これでdratにアーカイブが追加され、src/contrib/PACKAGESが更新されているはずです。

$ git status
On branch gh-pages
Your branch is up-to-date with 'origin/gh-pages'.

Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   src/contrib/PACKAGES
        modified:   src/contrib/PACKAGES.gz

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        src/contrib/sugoiPkg_0.0.1.tar.gz

これをコミットしてプッシュします。

$ git add src
$ git commit -m 'add sugoiPkg'
$ git push origin gh-pages

すると、addRepo()さえすれば、install.packages()でインストールできるようになります。

library(drat)
addRepo("yutannihilation")   # ここは自分の名前
install.packages("sugoiPkg")

SUGOIII!

とはいうものの、、

今のところ?addRepo()したものはそのセッション中しか有効じゃないみたいです。なので、Rを立ち上げなおすたびに毎回addRepo()することになってめんどくさいです。

ということで、まだ仕組みが整うのは先のようですが、整えば便利そうなのでますますCRAN離れに拍車がかかりそうな雰囲気です。しかし、DirkはなんかCRANに恨みでもあるんでしょうか。もはや怨念すら感じます...。