はじめに
友人がRStanの環境作りにはまり、それを解決する日本語の記事が見当たらなかったのでここに残しておきます。
環境
OS:Windows8
R:3.5.1
RStdio:1.1
Rtools:3.4 (g++:4.9.3)
RStan:2.17.3
インストール手順
基本的には以下のURLに従って進めます。
RStan Getting Started (Japanese)
しかし、RStanのインストールまで済ませてモデルのフィッティングを行う以下のコードを実行すると
fit <- stan(file = '8schools.stan', data = schools_dat,
iter = 1000, chains = 4)
次のエラーが出て終了しました。
Error in compileCode(f, code, language = language, verbose = verbose) :
Compilation ERROR, function(s)/method(s) not created! Error in .shlib_internal(commandArgs(TRUE)) :
C++14 standard requested but CXX14 is not defined
原因
RToolsによってインストールされるg++のバージョンが4.9.3だったのですが、RからC++14を要求されているらしく、4.9.3のバージョンでは実行時にオプションをつけないとc++14を利用できないことが原因でした。
対処
結果的には、以下のURLに従って ~/.R/Makevars ファイルを生成することで無事にエラーを解消することができました。
Installing RStan on Windows
このページ内の以下のコードをコンソールで実行することによって解決できました。
dotR <- file.path(Sys.getenv("HOME"), ".R")
if (!file.exists(dotR))
dir.create(dotR)
M <- file.path(dotR, "Makevars")
if (!file.exists(M))
file.create(M)
cat("\nCXX14FLAGS=-O3 -Wno-unused-variable -Wno-unused-function",
"CXX14 = g++ -std=c++1y",
file = M, sep = "\n", append = TRUE)
このコードでは、~/.R/に以下のMakevarsファイルを生成します。
CXX14FLAGS=-O3 -Wno-unused-variable -Wno-unused-function
CXX14 = g++ -std=c++1y
Rのコードの実行時にMakevarsにC++のコンパイルコマンドを読みにくるようです。
今回引っかかったのはC++14の利用だったので、最適化オプションであるCXXFLAGSは無くてもいいかもしれません(まああったほうがいいとは思います)。
もう一つ引っかかったこと
実は上のコンソールコマンドを実行する時にSys.getenv("HOME")
でホームディレクトリが正しく取得できなかったのですが、これはユーザー名を日本語にしていたためパスに日本語が含まれていたことが原因でした。変えるのにレジストリいじる必要があってとてもめんどくさかったのでwindowsは悪(過激派)(ごめんなさい)