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に恨みでもあるんでしょうか。もはや怨念すら感じます...。