オフライン環境のWindows10にR環境を作る 2019年夏の陣
背景など
- オフラインのセキュア環境下(以下、「オフライン環境」もしくは「セキュア環境」)に分析環境を作りたい(R, Python等問わず)
- オンライン環境→セキュア環境への(安全な)ファイルの転送手段はある
- OSはWindows10
- 2019年8月末現在
- 個人の経験に基づくものです
めちゃくちゃ参考にさせていただきました
やること
簡単な言語処理も行いたいので、MeCab導入までがゴールです。 長くなったのでRMeCabは別の記事に分けます。
1. Rのインストール
RのexeファイルはここからダウンロードすればOK。これをセキュア環境に運んで、そこでこれをexeファイルを実行すれば良い。
https://cran.r-project.org/bin/windows/base/
注意!!
2019年8月末時点でのRの最新バージョンは3.6.1であるが、後のパッケージ導入などでエラーになるので、3.5系にしたほうが良い。古いバージョンはここから。
https://cran.r-project.org/bin/windows/base/old/
動作確認
RGuiを起動してRが実行できるか確認する。自分はだいたいこんな感じのことをします(描画の確認もしたいので)。
head(iris) plot(iris$sepal.Length)
Rtoolsのインストール
WindowsでパッケージをインストールするためにRtoolsを入れる必要がある、らしい(普段Macユーザーなのでよく知らなかったけれども、パッケージインストールのときにエラーでたりなどしたので)。
Rtoolsも公式からexeファイルをインストールする。
https://cran.r-project.org/bin/windows/Rtools/
また注意!!
2019年8月末時点でのRの最新バージョンはRtools35であるが、どうやら不安定らしいので、「Rのバージョン3.5系 ✕ Rtools34以下」が良いらしい(伝聞)。Rtools35の説明には「R 3.3.x and later」とあるが… なので、一旦ここではRtools33にしました。
2. RStudio Desktopの導入、起動
別にRGuiがあればええやろ、って感じなんですが、セキュア環境のWindows10がもっさりしているうえにRGuiも操作がしにくいので、Rstudioを入れることを優先します。
Rstudio公式からOSに合わせてインストールします。これはバージョンはなんでもよかったです。とくに詰まることもなし。
https://www.rstudio.com/products/rstudio/download/#download
3. Rパッケージの追加インストール(tidyverse環境を作る)
Rに限った話ではないけれども、入れたいパッケージがあってもそれについての依存パッケージがあることがある。その依存パッケージにもまた依存パッケージがあることがある。こうなると網羅するのが難しくなる。
依存パッケージを含めてRのパッケージをインストールするにはminiCRAN
パッケージを使うのが良い。以下が参考にさせていただいたリンクです。
- miniCRANパッケージを使ってパッケージをオフラインインストールする
- R オフラインでのパッケージインストール
- Rstanをソースからインストール(オフラインで)
- How to install stringi from local file (ABSOLUTELY no Internet Access)
まずはminiCRAN
パッケージでの実行コード全体です。詳細はそれぞれ解説します。
ちなみにRMeCabパッケージはこれではインストールできません。詳細は後述します。
# miniCRANパッケージをインストール install.packages("miniCRAN") # 必要なパッケージ install.packages("tidyverse") install.packages("lubridate") install.packages("ltm") install.packages("RMeCab", repos = "http://rmecab.jp/R") # 依存パッケージを網羅する library(miniCRAN) p1 <- pkgDep("tidyverse") p2 <- pkgDep("lubridate") p3 <- pkgDep("ltm") p4 <- pkgDep("RMeCab") # これは依存パッケージないらしい pkgs <- c(p1, p2, p3, "RMeCab") print(pkgs) # パッケージのダウンロード download.packages(pkgs, destdir = "./R_pkgs")
①miniCRAN
パッケージのインストール
オンライン環境でminiCRAN
パッケージのインストールを行う(入ってなければ)。
# miniCRANパッケージをインストール install.packages("miniCRAN")
②オフラインで使用したいパッケージをリストアップする
今回自分が欲しかったのは、一旦最低限tidyverse
, lubridate
, RMeCab
。
参考リンクにltm
があったのと、もしかすると項目反応理論使うかもしれないのということでこちらも。
③パッケージの依存関係をpkgDep
関数で調べる
miniCRAN
パッケージのpkgDep
関数を用いて入れたいパッケージの依存パッケージを調べる。例えばtidyverse
は以下のようになる。(多い)
> pkgDep("tidyverse") [1] "tidyverse" "broom" "cli" "crayon" "dplyr" [6] "dbplyr" "forcats" "ggplot2" "haven" "hms" [11] "httr" "jsonlite" "lubridate" "magrittr" "modelr" [16] "purrr" "readr" "readxl" "reprex" "rlang" [21] "rstudioapi" "rvest" "stringr" "tibble" "tidyr" [26] "xml2" "backports" "generics" "nlme" "reshape2" [31] "assertthat" "DBI" "glue" "R6" "tidyselect" [36] "pkgconfig" "Rcpp" "BH" "plogr" "ellipsis" [41] "digest" "gtable" "lazyeval" "MASS" "mgcv" [46] "scales" "viridisLite" "withr" "vctrs" "curl" [51] "mime" "openssl" "clipr" "cellranger" "progress" [56] "callr" "fs" "rmarkdown" "whisker" "selectr" [61] "stringi" "fansi" "pillar" "lifecycle" "processx" [66] "rematch" "Matrix" "lattice" "askpass" "utf8" [71] "prettyunits" "plyr" "knitr" "yaml" "htmltools" [76] "evaluate" "base64enc" "tinytex" "xfun" "labeling" [81] "munsell" "RColorBrewer" "zeallot" "sys" "highr" [86] "markdown" "colorspace" "ps" "feather"
④パッケージのダウンロード
これらのパッケージをzip形式でダウンロードし、オフライン環境に持っていってパッケージをインストールすれば使えるようになる。
あらかじめzipファイルを格納するディレクトリを作っておくと良いです。
今回はカレントディレクトリ下に./R_pkgs
ディレクトリを作りました。
# パッケージのダウンロード download.packages(pkgs, destdir = "./R_pkgs")
入れたいパッケージを一気に入れたいのでとりあえず全部の依存パッケージをとりあえず連結。なおRMeCab
には依存パッケージがないらしいのでエラーになりますが焦らず。
> p1 <- pkgDep("tidyverse") > p2 <- pkgDep("lubridate") > p3 <- pkgDep("ltm") > p4 <- pkgDep("RMeCab") # これは依存パッケージないらしい pkgDep("RMeCab") でエラー: No valid packages in pkg > > pkgs <- c(p1, p2, p3, "RMeCab") > print(pkgs) [1] "tidyverse" "broom" "cli" "crayon" "dplyr" [6] "dbplyr" "forcats" "ggplot2" "haven" "hms" [11] "httr" "jsonlite" "lubridate" "magrittr" "modelr" [16] "purrr" "readr" "readxl" "reprex" "rlang" [21] "rstudioapi" "rvest" "stringr" "tibble" "tidyr" [26] "xml2" "backports" "generics" "nlme" "reshape2" [31] "assertthat" "DBI" "glue" "R6" "tidyselect" [36] "pkgconfig" "Rcpp" "BH" "plogr" "ellipsis" [41] "digest" "gtable" "lazyeval" "MASS" "mgcv" [46] "scales" "viridisLite" "withr" "vctrs" "curl" [51] "mime" "openssl" "clipr" "cellranger" "progress" [56] "callr" "fs" "rmarkdown" "whisker" "selectr" [61] "stringi" "fansi" "pillar" "lifecycle" "processx" [66] "rematch" "Matrix" "lattice" "askpass" "utf8" [71] "prettyunits" "plyr" "knitr" "yaml" "htmltools" [76] "evaluate" "base64enc" "tinytex" "xfun" "labeling" [81] "munsell" "RColorBrewer" "zeallot" "sys" "highr" [86] "markdown" "colorspace" "ps" "feather" "lubridate" [91] "stringr" "Rcpp" "glue" "magrittr" "stringi" [96] "cli" "crayon" "digest" "evaluate" "praise" [101] "R6" "rlang" "withr" "assertthat" "highr" [106] "markdown" "yaml" "xfun" "mime" "jsonlite" [111] "rex" "httr" "curl" "openssl" "lazyeval" [116] "askpass" "sys" "testthat" "knitr" "covr" [121] "ltm" "MASS" "msm" "polycor" "survival" [126] "mvtnorm" "expm" "Matrix" "lattice" "RMeCab" > download.packages(pkgs, destdir = "./R_pkgs") URL 'https://cran.rstudio.com/src/contrib/tidyverse_1.2.1.tar.gz' を試しています Content type 'application/x-gzip' length 61647 bytes (60 KB) ================================================== downloaded 60 KB ... (中略) [,1] [,2] [1,] "tidyverse" "./R_pkgs/tidyverse_1.2.1.tar.gz" [2,] "broom" "./R_pkgs/broom_0.5.2.tar.gz" [3,] "cli" "./R_pkgs/cli_1.1.0.tar.gz" [4,] "crayon" "./R_pkgs/crayon_1.3.4.tar.gz" [5,] "dplyr" "./R_pkgs/dplyr_0.8.3.tar.gz" [6,] "dbplyr" "./R_pkgs/dbplyr_1.4.2.tar.gz" [7,] "forcats" "./R_pkgs/forcats_0.4.0.tar.gz" [8,] "ggplot2" "./R_pkgs/ggplot2_3.2.1.tar.gz" ...
⑤zipパッケージをオンライン環境→オフライン環境に持っていく
セキュアサーバーだったりUSBだったり。./R_pkgs
ごと持っていってしまえば楽だと思います。
⑥オフライン環境でzipファイルをソースにしてパッケージをインストールする
オフライン環境で⑤で置いたパッケージのgzファイルを指定してinstall.packages
関数を実行する。
install.packages("hoge.tar.gz", repos = NULL, type = "source")
大量のパッケージ1つずつ実行するのが大変なので1列目にパッケージ名、2列目にgzファイルが書かれたデータフレームpkgs_list
を作ってfor文で回したりしていた。もっといい方法ありますか?(質問を投げかけるスタイル)
for(1 in 1:nrow(pkgs_list)){ install.packages(pkgs_list[i, 2], repos = NULL, type = "source") }
注意:入らないパッケージについて
miniCRAN
を利用してインストールしたいくつかのパッケージに関するgzファイルは、install.packages
を実行すると外部のgithubを呼びに行ったりする。こうなってしまうとオフライン環境ではパッケージをインストールすることができない。
自分が遭遇したのは以下のパッケージ。
stringi
curl
xml2
openssl
例えばstringi
を入れようとするとこんな感じのエラーになる。
これについては参考先で
このパッケージはCRANのサイトで提供されているPackage Sourceファイルだけでは足りず、このインストールプロセスの中で外部のWebサイトを参照してファイルを勝手にダウンロードしようとします。そこでインターネットにアクセスできないとエラーになります。(まったく嫌がらせとしか思えない...) そのため"stringi"については、CRANのサイトではなく以下のサイトから、tar.gzファイルを入手する必要があります。 https://github.com/gagolews/stringi/releases ここから入手したものには、必要な全てのファイルが含まれているので外部サイトのアクセスは行われないようです。
つまり、miniCRAN
を利用してインストールしたバージョンのgzファイル(パッケージファイル)だとwebサイトを参照しようとするらしい。(最新だとダメなのか…?と思ったけれどもそういうわけでもないらしい)
stringi
については、↑のリンク先のgithub.comから入手したが、CRANにあるr-oldrel
でもいける。stringi
以外はそうした。
r-oldrel
は、、CRANのパッケージ説明サイト下図の一番右のもの。(※これはcurl
の例)
依存パッケージを全部入れたらtidyverse
環境の完成です。
4. RMeCabの導入、起動
長くなりましたし、RMeCabだけで独立した話のような気もするので、別の記事に分けました。こちらです。
スペシャルサンクス
詰まったところ(主にパッケージインストール関連の部分)は、r-wakalangで丁寧に教えていただきました。ありがとうございます!