UbuntuでRをインストールするならレポジトリを追加しよう

### 概要

R Markdownに必要なknitrパッケージをRにインストールしようとしてもできなくてハマった話です。knitrだけでなくその他のいくつかのパッケージもRにインストールできませんでした。私はUbuntu 14.04に`$ sudo apt-get install r-base`でRをインストールしていたのですが、これだけでは最新のRがインストールされないことが原因でした。最新のRをUbuntuにインストールする方法は [UBUNTU PACKAGES FOR R - CRAN](https://cran.r-project.org/bin/linux/ubuntu/README.html) にあります。日本語の説明は [UbuntuにRをインストールするための手順 - トライフィールズ](http://www.trifields.jp/install-r-in-ubuntu-1000) が分かりやすいです。ポイントはCRANのレポジトリを追加しないと最新版がインストールできないことです。この記事では私のトラブルの話と、上記リンクの補足になるレポジトリやSecure APTの解説を書きます。もし、Ubuntuに今すぐRをインストールしたい方がいましたら、上記リンクに飛んでください。


### R Markdownを使いたいのにknitrパッケージがインストールできない

私はRで計算して計算結果をノートにまとめてブログに記事を投稿するのに、次のようなことをしています。

1. RStudioで新規プロジェクトを開く。
2. スクリプトファイルにコメントとコードを書いて、`Ctrl + Enter`で実行する。
3. 2を繰り返して計算がまとまったら、コンソール出力をノート（Evernote）にコピペする。合わせて考察やメモをノートに書く。
4. 記事にしたいノートをブログの草稿にコピペして、それを基にMarkdownで記事を書く。
5. 記事をブログに投稿する。

記事やレポートを書いていると、計算をやり直したり、新しい計算をする時がよくあります。自分用と人用の文章では書き方が違うからです。その時にRプロジェクトを開いて、計算して、Evernoteにコピペして、記事にもコピペして、という工程はめちゃめちゃ面倒です。面倒だからノートに計算結果を書かずに記事にだけ書いたりして、後から見直す時に情報がばらばらになっていてわけがわかりません。

それで、このいわゆる計算の再現性が低い状態を何とかしたいと思っていました。他の人はどうしているのかと調べていたらR Markdownというものがあって、これでコード、コードの実行結果、説明を加えたレポートの作成をR Markdownで一貫して行えるというじゃありませんか。素晴らしいです。私も使いたい。

[R Markdownで楽々レポートづくり - gihyo.jp](http://gihyo.jp/admin/serial/01/r-markdown) に習って、とりあえずサンプルのRmdファイルをダウンロードしてRStudioでhtmlに変換しようとしたら、「knitrパッケージが必要だからインストールしてね」的なメッセージが表示されてできませんでした。じゃあ、knitrパッケージをインストールしようかと試みましたが、

```r:Rコンソール
> install.packages("knitr")
Installing package into ‘/home/user/R/x86_64-pc-linux-gnu-library/3.0’
(as ‘lib’ is unspecified)
Warning in install.packages :
  package ‘knitr’ is not available (for R version 3.0.2)
```

Warningが出てインストールできません。

実はこの時点でまさにknitrパッケージをインストールできない原因を、Rは

> package ‘knitr’ is not available (for **R version 3.0.2**)

と教えてくれていました。しかし私はUbuntuにRをインストールしたばかりで最新バージョンのRを使っていると思い込んでいたため、使っているRのバージョンが古いなんて思いもしませんでした。さらに私がアホなのは、エラーの原因を探して [How should I deal with “package 'xxx' is not available (for R version x.y.z)” warning? - Stack Overflow](http://stackoverflow.com/questions/25721884/how-should-i-deal-with-package-xxx-is-not-available-for-r-version-x-y-z-wa) を見つけていたにも関わらず、この回答がやたら長くて読むのがめんどうだから真面目に考えるのはやめてその日は寝たことです。翌日から日常に流されてこのQ and Aをすっかり忘れてしまいました。


### いくら調べてもパッケージがインストールできない原因がわからない

2、3日あいて、やっぱりR Markdownが使いたくて、再度knitrパッケージのインストールを試みました。レポジトリを指定してもエラーが返されます。

```r:Rコンソール
> install.packages("knitr", repos=getOption("https://cran.r-project.org"))
Installing package into ‘/home/user/R/x86_64-pc-linux-gnu-library/3.0’
(as ‘lib’ is unspecified)
Warning: invalid package ‘knitr’
Error: ERROR: no packages specified
```

*ERROR: no package specified*? スペルミスか、そもそもknitrパッケージなんて存在しないのかと思い、CRANのウェブサイトを見たら https://cran.r-project.org/package=knitr にちゃんとあります。

使用可能なパッケージを見たら何かわかるかもしれないと思い、見てみました。

```r:Rコンソール
> ap <- available.packages()
> View(ap)
```

変数`ap`を "knitr" でフィルタリングしたら、ezknitrやknitrBootstrapパッケージはあっても、knitrはありません。

何かしらの原因で実際のレポジトリの内容と使っているレポジトリの内容が食い違っているのかと想像しましたが、それ以上のことはわかりませんでした。


### Rをアップデートしてみようかと思いつく

2016年6月にUbuntuにRをインストールしたばっかりだけど、knitrのラストアップデートが2016年8月とRをインストールしたよりも後だったので、Rをアップデートしてみようかと思いつきました。Rのインストールは`$ sudo apt-get install rhoge`だと思ったのですが正確に思い出せないので、これを機にウェブで調べたら [UbuntuにRをインストール - Qiita](http://qiita.com/wonder_zone/items/c0cb4033c2a599b3d662) に、

> 何も考えずにapt-get install r-baseとすると、実は大変古いバージョンがインストールされます。

と書いてありました。

え？うそでしょうと思いつつ、Rのバージョンを確かめたら、

```bash:ターミナル
$ R
R version 3.0.2 (2013-09-05) -- "Bug in Your Hair"
```

3年前のバージョンでした(´д｀) てっきり最新バージョンだと思い込んでいました。

これが原因だとようやく気づき、上記のQiitaの記事の参考ページ [UbuntuにRをインストールするための手順 - トライフィールズ](http://www.trifields.jp/install-r-in-ubuntu-1000) の通りにRを再インストールしました。

[How should I deal with “package 'xxx' is not available (for R version x.y.z)” warning? - Stack Overflow](http://stackoverflow.com/questions/25721884/how-should-i-deal-with-package-xxx-is-not-available-for-r-version-x-y-z-wa) をよく読むとこのことが書かれているので、原因に気づくのに無駄な時間がかかってしまいました。


### UbuntuにRの最新バージョンをインストールする

この節ではUbuntuにRをインストールする流れを解説しながら書きます。オリジナルソースは [UBUNTU PACKAGES FOR R - CRAN](https://cran.r-project.org/bin/linux/ubuntu/README.html) です。本稿はオリジナルソースにはないSecure APTなどの補足説明があります。

Ubuntuはバージョンで異なるコードネームがあり、CRANはコードネーム別にRのバイナリパッケージ(debファイル)を用意しています。debファイルはレポジトリ https://cran.r-project.org/bin/linux/ubuntu/ にまとめられています。他にもミラーサイトが世界中にあり、[CRAN Mirrors](https://cran.r-project.org/mirrors.html)にミラーサイトのリストがあります。UbuntuのaptはデフォルトではCRANのレポジトリをソースリストに含みませんので、どれか1つのレポジトリを追加する必要があります。これが以下の作業です。

```bash:ターミナル
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.4 LTS"
```

`lsb-release`(LSB: Linux Standard Base)から私のUbuntuのコードネームは**trusty**だとわかります。例えば日本のCRANミラーサイトに The Institute of Statistical Mathematics, Tokyo があります。このミラーサイトのtrustyのdebファイルは https://cran.ism.ac.jp/bin/linux/ubuntu/trusty にあります（`TOP > Software > R Binaries > linux > ubuntu > trusty`とたどれます）。そこで、aptのソースリストファイルにこのレポジトリを追加します。

```bash:ターミナル
$ sudo gedit /etc/apt/sources.list
```

でファイルを開き、

```:/etc/apt/sources.list
deb https://cran.ism.ac.jp/bin/linux/ubuntu trusty/
```

この一行を最終行に追加します（なぜ /ubuntu/trusty/ ではなく /ubuntu trusty/ なのかわかりません）。

Secure APTを使わなくてよいなら、この段階で、

```bash:ターミナル
$ sudo apt-get update
$ sudo apt-get install r-base
```

とすればUbuntuへの最新バージョンのRのインストールは完了します。

Secure APT(公開鍵暗号方式でレポジトリ-ローカル間を暗号通信する)でインストールをする場合、aptに公開鍵を登録します。

```bash:ターミナル
$ gpg --keyserver keyserver.ubuntu.com --recv-key E084DAB9
$ gpg -a --export E084DAB9 | sudo apt-key add -
```

gpgは暗号化ソフトウェアで [GnuPGで遊ぶ - そんなこと覚えてない](http://blog.eiel.info/blog/2013/07/31/gpg/) に分かりやすい説明があります。[keyserver.ubuntu.com](http://keyserver.ubuntu.com/) はgpgで使用する鍵のデータベースで、鍵の照会や提供などを行うサーバーです。E084DAB9は鍵IDです。なぜこの鍵IDを使うのかというと、[UBUNTU PACKAGES FOR R - CRAN](https://cran.r-project.org/bin/linux/ubuntu/README.html) に

> The Ubuntu archives on CRAN are signed with the key of “Michael Rutter marutter@gmail.com” with key ID E084DAB9

と書かれているように、M. Rutterさんが鍵をgpgで作成した際に割り振られたIDがE084DAB9だからです。

gpgはユーザーID(名前 メールアドレス)で鍵を照会することができます。

```bash:ターミナル
$ gpg --search-keys marutter
gpg: searching for "marutter" from hkp server keys.gnupg.net
(1)	Launchpad PPA for marutter
	  1024 bit RSA key B04C661B, created: 2010-11-14
(2)	Michael Rutter <marutter@gmail.com>
	  2048 bit RSA key E084DAB9, created: 2010-10-19, expires: 2020-10-16
Keys 1-2 of 2 for "marutter".  Enter number(s), N)ext, or Q)uit > q
```

鍵ID E084DAB9の鍵は、2048bitのRSA暗号で作成されたことがわかります。

```sh
$ gpg --keyserver keyserver.ubuntu.com --recv-key E084DAB9
gpg: requesting key E084DAB9 from hkp server keyserver.ubuntu.com
gpg: key E084DAB9: public key "Michael Rutter <marutter@gmail.com>" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)
```

このコマンドによりkeyserver.ubuntu.comからID E084DAB9の鍵が取り寄せられます。鍵が取り寄せできたかは、

```bash:ターミナル
$ gpg --list-keys                                         
/home/user/.gnupg/pubring.gpg
-------------------------------
pub   2048R/E084DAB9 2010-10-19 [expires: 2020-10-16]
uid                  Michael Rutter <marutter@gmail.com>
sub   2048R/1CFF3E8F 2010-10-19 [expires: 2020-10-16]
```

で確かめられます。

```bash:ターミナル
$ gpg -a --export E084DAB9 | sudo apt-key add -
```

鍵はバイナリファイルですので`-a`オプションをつけてアスキーコードに変換した鍵を標準出力し、apt-keyに加えます。加えた鍵を確認するには、

```bash:ターミナル
$ apt-key list     
/etc/apt/trusted.gpg
...
pub   2048R/E084DAB9 2010-10-19 [expires: 2020-10-16]
uid                  Michael Rutter <marutter@gmail.com>
sub   2048R/1CFF3E8F 2010-10-19 [expires: 2020-10-16]
...
```

とすれば確認できます。

この後、暗号通信ではないaptと同様にアップデートしてRをインストールしました。

```bash:ターミナル
$ sudo apt-get update
$ sudo apt-get install r-base
```

CRANのレポジトリを追加して、Secure APTでインストールしたRのバージョンを確かめると、

```bash:ターミナル
$ R
R version 3.4.1 (2017-06-30) -- "Single Candle"
```

ちゃんと最新のR 3.4.1にアップデートできました。


### knitrパッケージを再度インストールする

Rにknitrパッケージをインストールします。

```r:Rコンソール
> install.packages("knitr")
Installing package into ‘/home/user/R/x86_64-pc-linux-gnu-library/3.3’
(as ‘lib’ is unspecified)
trying URL 'https://cran.rstudio.com/src/contrib/knitr_1.14.tar.gz'
Content type 'unknown' length 1017858 bytes (994 KB)
==================================================
downloaded 994 KB

* installing *source* package ‘knitr’ ...
** package ‘knitr’ successfully unpacked and MD5 sums checked
** R
** demo
** inst
** preparing package for lazy loading
** help
*** installing help indices
** building package indices
** installing vignettes
** testing if installed package can be loaded
* DONE (knitr)

The downloaded source packages are in ‘/tmp/Rtmpy19JUG/downloaded_packages’
```

Rにknitrパッケージのインストールも無事にできました！R Markdownのサンプルファイルもhtmlにできました。これでようやくR Markdownの準備が整いました。