【R】オフラインPCへのパッケージ導入をアプリで解決する

# オフラインPCにパッケージを導入するのはすこし面倒

- 以下の数行が必要

```オンラインPCconsole.R
install.packages("miniCRAN")
library(miniCRAN)

# 必要なパッケージをリスト
pkglist <- pkgDep("packagename")

# パッケージを特定のディレクトリにダウンロード
## win ---
download.packages(pkglist, destdir = "path_to_dir", type = "win.binary")

## mac ---
download.packages(pkglist, destdir = "path_to_dir", type = "source")

```

- 導入先PCにインストールするために以下のコードも必要

```オフラインPCconsole.R

# win
install.packages( c("path_to_downloaded_file/packagename.zip",
                    "path_to_downloaded_file/packagename2.zip",
　　　　　　　　　　　"path_to_downloaded_file/packagename3.zip",
                    "path_to_downloaded_file/packagename4.zip",
                    "..."), 
    repos = NULL, conrib.url="win.binary", type = "win.binary")

# mac
install.packages( c("path_to_downloaded_file/packagename.tar.gz",
                    "path_to_downloaded_file/packagename2.tar.gz",
                    "path_to_downloaded_file/packagename3.tar.gz",
                    "path_to_downloaded_file/packagename4.tar.gz",
                    "..."), 
    repos = NULL, type = 'source')
```

- すこし面倒

`"path_to_downloaded_file/packagename...."`の箇所が特に面倒だなと個人的に思ってました。
(ダウンロードした時のコンソールから矩形で該当部分切り取るなど)

# アプリで自動化

![image.png](https://qiita-image-store.s3.amazonaws.com/0/143058/40cd1979-b40d-95b1-d43d-6d7d7f1fee61.png)


入力：必要なパッケージ, パッケージをダウンロードするフォルダへのpath
出力：オフラインPCでのインストールに必要なコード

##　使い方

### 0.アプリの依存パッケージを導入
```オンラインPCconsole.R
dynamic_require <- function(package){
  if(eval(parse(text=paste("require(",package,")"))))return(TRUE)
  
  install.packages(package)
  return(eval(parse(text=paste("require(",package,")"))))
}

dynamic_require(c("dplyr","shiny","rintrojs","miniCRAN","shinymaterial"))

```

### 1.アプリを起動 (Open in Browser推奨)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/143058/292540aa-7896-f092-a592-4dee071bb21b.png)
#### 1.1 ガイドをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/143058/3f6ef0b4-9425-9304-2c78-9a02f588092c.png)
rintrojsがイントロダクションしてくれます↓
![image.png](https://qiita-image-store.s3.amazonaws.com/0/143058/8ed7f9f9-c8fe-f26c-c6f4-bbe0c83f21ad.png)

### 2.パッケージを入力　(ダブルクォート、スペースなし)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/143058/3e3ac465-a9ed-5456-1603-9ec6e98d4686.png)
### 3.オフラインPCのOSを選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/143058/e8cdad2f-b01c-a2df-249e-cd62cf1d4854.png)
### 4.パッケージファイルのダウンロード先を指定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/143058/92ca4a11-ac10-923c-a5b4-1bdbf469573b.png)
### 5.ダウンロード実行
![image.png](https://qiita-image-store.s3.amazonaws.com/0/143058/6ea4a474-b48f-bd42-37d8-f7ebaeb190e3.png)
clickするとダウンロード開始と終了をお知らせ 

![image.png](https://qiita-image-store.s3.amazonaws.com/0/143058/96e0ca7d-e03f-2f44-8fb8-9b9e10c82a30.png)
↓ 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/143058/9d5a6d0b-7e21-add5-6d35-b90bc447f5bb.png)

指定したフォルダにパッケージがダウンロードされていきます。

### インストール用のコードを取得
![image.png](https://qiita-image-store.s3.amazonaws.com/0/143058/4d2fbe76-734f-dd3b-edcc-4d8df48baf3f.png)
clickするとコードが表示される

![image.png](https://qiita-image-store.s3.amazonaws.com/0/143058/4e946cf4-1213-e512-a20c-2586def0e519.png)
 … (略)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/143058/8d67f804-3951-3f29-66dd-d02a6ea02076.png)

これをコピペしてスクリプトとして保存しておくと、
オフラインPCでパッケージを導入するときに少しだけ作業が楽になると思います！


# まとめ

オフラインPCへのパッケージ導入を支援できればと思って作りました。
勉強にはなりましたが、作り終わった後に[インフラ屋さんのためのR言語: 環境構築編](https://qiita.com/tomotagwork/items/5cd9362f386d330fe96a)にある以下の記述をみて、そっちのほうが楽だなと思いました。

>正式な方法かどうかは分かりませんが、手っ取り早い方法としては...
Windows版にパッケージをインストールすると、Rインストールディレクトリ下のlibraryディレクトリにそのパッケージ関連のファイルが展開されます。
なので、Webに接続できるマシン上で必要なパッケージを一通りインストールしてあげて、libraryディレクトリ以下をまるごとzipで固めて対象マシンに持っていって、ディレクトリ毎置き換えてあげます。
とりあえずそれでうまくいってます。



アプリのソースコードは[github](https://github.com/sasakiK/DownloadRPackages)に置きました。
もしよろしければダウンロードして使ってみてください。

実際のパッケージDLはできませんが、アプリの起動だけであれば以下のコードでできると思います、
イメージとして参考にしてください。

```console.R
library(shiny)
runGitHub(repo = "DownloadRPackages", username = "sasakiK")
```

# 参考

[Rオフラインでのパッケージインストール](https://qiita.com/daifuku_mochi2/items/33f8525cdac1cc775c5f)
[インフラ屋さんのためのR言語: 環境構築編](https://qiita.com/tomotagwork/items/5cd9362f386d330fe96a)
[elegant-way-to-check-for-missing-packages-and-install-them](https://stackoverflow.com/questions/4090169/elegant-way-to-check-for-missing-packages-and-install-them)



2018.06 振り返って考えてみるとDockerで全てが解決する話だなと思います。