【R tips】M1 MacにMiniforge3でR(Tidyverse)の環境を構築する

M1 Macを購入したのでRの分析環境を準備しようと思ったのですが、condaの仮想環境を利用してRを入れたらいくつかつまづいた点があったので対応を残すことにします。

データ分析はほぼ趣味で、環境構築も不得手なのでもっと良い対応方法があればぜひ教えていただけると嬉しいです。

なぜMiniforge3の仮想環境下にRをインストールしようとしたか

通常RをインストールするのであればCRAN/HomebrewでRを入れると思いますが、今回は次の理由からMiniforge3の仮想環境にRを準備しようと考えました。

  • RStudioがApple Siliconにnative対応していない(Rosetta2を入れれば使える)
  • Pythonも入れたい(+仮想環境で構築したい)
  • どうせならPythonとRで同じエディタを使ってみたい
  • MacのDockerは速度がいまいち?そうなのでひとまず使わないで対応してみたい

結論:よほどの理由がなければRはCRANからダウンロードして利用するのがおすすめ

Rを仮想環境で使いたい理由が「Rでパッケージ管理したことがなかったので一度やってみたい」だったのですが、理由がこれだけならおとなしくCRANからRをインストールした後に renv を使う方が手間がないかなと思います(RのManualに従えばCRANからインストールすることになりますし)。

conda-forgeのR_v4.1.3はM1 Macにも対応しているのですが、よく使われるTidyverse群をまとめてinstall.packages(”tidyverse”)しようとしてもインストールできず、一手間増えます。

また、仮にHomebrewでインストールするのであれば(ちゃんと動作確認まではしていないですが)caskで入れるとCRANのpkgからインストールされるようなのでおそらくinstall.packages()時にbuildをsource/binaryで選べますが、formulaeのほうだと毎回sourceからになるはずです。

トラブル1:r-base_v4.1.3から素直にTidyverseを入れられない

Miniforge3を入れた後、conda-forgeリポジトリにr-baseがあるのでconda install r-base でr-baseを入れるまではよかったのですが、conda install r-tidyverse をしたところconflictが発生してしまいました。

ここで何かしらちゃんと対応すればcondaでr-tidyverseを入れられたのかもしれませんが、Pythonでのpipとcondaを共存させるなと同じでRのパッケージ管理もcondaとinstall.packages()が入り乱れると訳がわからなくなりそうだと思ったのでr-baseだけはcondaで、Rパッケージは全てinstall.packages()で対応しようと考えました。

そのため仮想環境下に用意したRを立ち上げ、install.pacakges(”tidyverse”)したのですが、次のエラーが発生してtidyverseのインストールが完了しませんでした。

Invalid configuration arm64-apple-darwin20.0.0′: machine arm64-apple’ not recognized configure: error: /bin/sh ./config.sub arm64-apple-darwin20.0.0 failed make: *** [Makevars:31: libuv-1.38.1/Makefile] Error 1 ERROR: compilation failed for package ‘fs’

RとtidyverseはM1 nativeだと聞いていたのになんだろう〜と思って調べたところ、githubのissueでhomebrewからインストールしたRではfsパッケージのインストールに失敗する報告がありました。

Unable to install on Mac M1 · Issue #348 · r-lib/fs
Hi! I'm struggling to install fs (as a subdependency to the languageserver package) on Darwin Kernel Version 21.1.0: Thu...

とりあえずconda-forgeリポジトリのr-fsも確認したところ、この問題について対応済み(Pull Request #27)だったのでfsパッケージだけはcondaでインストールした後、再度install.pacakges(”tidyverse”)したら無事インストールできました。

トラブル2:RStanがインストールできない

install.packages('rstan') するとrstanのコンパイル中にエラーが発生し、失敗します。

これも調べてみたところ、他のパッケージで同じ報告がありました。

R on ARM Mac M1:load failed for ‘stats’ and Rlog1p error · Issue #163 · conda-forge/r-base-feedstock
I read the conda-forge documentation and could not find the solution for my problem there. Issue: Environment (conda lis...

これはconda-forgeにあるr-baseがまだ未対応のようで、gitとconda installの理解が及ばず問題は解消しませんでした。

(上のリンクを見る限りはreceipeを修正すればいいようでなのですが、なぜmergeが進んでないのかもよくわかりませんでした。)

加えてconda-forgeリポジトリにあるRStanはApple Siliconに対応しておらず、RStanのインストールは諦めました。

今はR_v4.2.0の対応が進んでいるようなのでそちらで解消されていることを願います。

トラブル3:VScodeでRのターミナルを利用するのに一手間必要

VScodeでのRの設定は拡張機能のR extensionに記載の方法を参考したのですが、そこには記載のなかったつまづきをメモしています。

なおこんな環境構成にしなければ全く問題なかったはずで、R extensionのGet Startedはとてもわかりやすく、感謝しています。

radianの起動オプションを追加で設定する必要がある

r.rpathにRのパスを、r.rtermにradianのパスを入れた状態でcmd+EnterでコードをRターミナルに送ろうとしても失敗します。

仮想環境にあるためか、radianがRを探しに行くときに見つけられないようでr.rtermのオプションで radian --r-binary=/path/to/R を追加する必要があります。

仮想環境を起動した状態でRを立ち上げる必要がある

あくまで仮想環境下で構築しているためか、cmd+Enterを押すと自動で立ち上がるRターミナルではinstall.packages()でコンパイルエラーが発生することがありました。

そのため、Extensionの設定でAlways Use Active TerminalをONにして、condaのR仮想環境を立ち上げ、radianを起動した後、そちらにコードを送るようにしています。

まとめ:とりあえずR+Tidyverseは使えるが、、

ただでさえRはPythonと比較して(日本語の)情報が見つけづらく、今回の作業も日本語での報告は探した限りでは見つけられませんでした。

今後RStan以外でも自分の使用したいパッケージが素直にインストールできる保証がないですし、vscodeを使いたいだけならCRANからローカルにRをインストールしてそれを使うのが一番だろうと思います。

それでも環境を分けたいのであればvscodeの拡張機能を利用してDockerで構築すべきだと痛感しました。

趣味の構築ならそこまで環境分けたりとか気にしてもどうせ1環境しか使わないからと積極的には使っていなかったんですが(Pythonも以前はpip+venvで対応していた)、VScodeの拡張機能であれば手軽に始められそうなので勉強し直そうと思います。

コメント

タイトルとURLをコピーしました