Rでパッケージのインストールができない!と思ったらただのメモリ不足だった話

vagrantに立てたRStudio Server(立て方は前回の記事参照)になんかパッケージ入れようとした時の話。

現象発生

とりあえずdevtoolsでも入れてみようと思って、

> install.packages("devtools")

とやるとつらつら出力が出て、特にエラーもなく最後まで行き着きます。
よしよし、インストールできた、と思って呼び出そうとすると、

> library(devtools)
Error in library(devtools) : there is no package called ‘devtools

あれっ?
そんなパッケージはないといわれます。なんで。。

何度繰り返してみても、インストールは失敗してないっぽいのに、
なぜかパッケージはない、と言われます。

むむ。

調査

ためしにverbose=TRUEを指定してみても、以下のような感じで、
succeededって出ていて成功してるようにしか見えません。

> install.packages("devtools", verbose=TRUE)

...

1): succeeded '/usr/lib/R/bin/R CMD INSTALL -l '/home/vagrant/R/x86_64-pc-linux-gnu-library/3.1' /tmp/RtmpXXXXXX/downloaded_packages/devtools_1.5.tar.gz'

The downloaded source packages are in
        ‘/tmp/RtmpXXXXXX/downloaded_packages’

一方で、パッケージがインストールされる場所にちゃんとあるか見に行ってみます。
パッケージがインストールされる場所は、ヘルプによると、.libPaths()[1]です。

> ?install.packages

...

Arguments:

...

     lib: character vector giving the library directories where to
          install the packages.  Recycled as needed.  If missing,
          defaults to the first element of ‘.libPaths()’.

でも実際、そこに行っても何のファイルもありませんでした。

> list.files(.libPaths()[1])
character(0)

むむむ。。

原因判明

うー、これはおかしい、と思って数時間悩んだ挙句、
syslogになんか出てないかなーと思ったら…

出てました。

May  3 12:36:48 vagrant-ubuntu-trusty-64 kernel: [ 2567.673177] R invoked oom-killer: gfp_mask=0x503da, order=0, oom_score_adj=0

RがOOM killerにやられてました。なんと。。
Rのトリッキーな出力に騙されて右往左往しましたが、メモリ不足、という単純な話でした。
恥ずかしい。。

解決策

ということでメモリを増やしてvagrantを再起動します。

まず、Vagrantfileに以下を追記します。
(メモリ量は適当に。私の場合は、デフォルトの1GBで足りなかったのでとりあえず2倍の2GBにしています)

  config.vm.provider :virtualbox do |vb|
    vb.customize ["modifyvm", :id, "--memory", "2048"]
  end
vagrant reload

で、再度install.packageすると無事成功しました。 めでたしめでたし!

まとめ

  • Rの出力は信用ならない(succeededというログは何だったのか…)
  • RStudio Serverはけっこうメモリを食う?
  • vagrantには十分なメモリを与えたほうがいい