Does it taste good?

「そんなことも知らないの?」って言わないでほしい。

オフライン環境のWindows10にR環境を作る 2019年夏の陣

背景など

  • オフラインのセキュア環境下(以下、「オフライン環境」もしくは「セキュア環境」)に分析環境を作りたい(R, Python等問わず)
  • オンライン環境→セキュア環境への(安全な)ファイルの転送手段はある
  • OSはWindows10
  • 2019年8月末現在
  • 個人の経験に基づくものです
    • なお普段はMacユーザーかつたまにLinuxかな?程度なのでオフラインどころかWindows自体に不慣れ

めちゃくちゃ参考にさせていただきました

やること

  1. R自体の導入、簡単なサンプル・スクリプトの実行確認
  2. RStudio Desktopの導入、起動
  3. Rパッケージの追加インストール(tidyverse環境を作る)
  4. RMeCabの導入、起動(※別記事

簡単な言語処理も行いたいので、MeCab導入までがゴールです。 長くなったのでRMeCabは別の記事に分けます。

kyyonko.hatenablog.com

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パッケージでの実行コード全体です。詳細はそれぞれ解説します。

ちなみに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を入れようとするとこんな感じのエラーになる。

stringi_error

これについては参考先

このパッケージは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の例)

curl_r_oldrel

依存パッケージを全部入れたらtidyverse環境の完成です。

4. RMeCabの導入、起動

長くなりましたし、RMeCabだけで独立した話のような気もするので、別の記事に分けました。こちらです。

kyyonko.hatenablog.com

スペシャルサンクス

詰まったところ(主にパッケージインストール関連の部分)は、r-wakalangで丁寧に教えていただきました。ありがとうございます!

qiita.com