久方振りにMacにRをインストールするので最新の情報をまとめてみる

# 概要
筆者は数年前に以下の記事でMacにHomebrewを用いてRをインストールする方法を投稿しました。当時はしばしばRを利用していたのですが、暫くRから遠ざかっていました。しかし、最近またRを利用したいと思い立ち、過去記事が投稿から随分月日が経っていることに気付きました。よって、2023年5月現在最新の情報をまとめて投稿します。

https://qiita.com/y-vectorfield/items/dd1a8e2715cace9981ec

# 環境情報
* macOS Monterey 12.6.5
* R version 4.3.0

# RをHomebrewを用いてインストール
Homebrewを用いてRをインストールします。以下のコマンドを実行するだけでインストール出来ます。途中でrootユーザーのパスワードの入力を求められるので、入力します。

```bash
brew install --cask r
```

<details><summary>詳細</summary><div>

```bash
$ brew install --cask r
==> Downloading https://cloud.r-project.org/bin/macosx/big-sur-arm64/base/R-4.3.0-arm64.pkg
Already downloaded: /Users/yuhkiyano/Library/Caches/Homebrew/downloads/df13ef92bb01fdd21f929bfbde0a073973497e8d258380fc2067de2d5c580b31--R-4.3.0-arm64.pkg
==> Installing Cask r
==> Running installer for r; your password may be necessary.
Package installers may write to any location; options such as `--appdir` are ignored.
Password:
installer: Package name is R 4.3.0 for macOS (ARM64)
installer: Installing at base path /
installer: The install was successful.
🍺  r was successfully installed!
```

</div></details>

# 起動確認
Rの起動確認を行います。ターミナル上でRを起動し、以下のプロンプトが表示されれば成功です。

```bash
$ r

R version 4.3.0 (2023-04-21) -- "Already Tomorrow"
Copyright (C) 2023 The R Foundation for Statistical Computing
Platform: aarch64-apple-darwin20 (64-bit)

R は、自由なソフトウェアであり、「完全に無保証」です。 
一定の条件に従えば、自由にこれを再配布することができます。 
配布条件の詳細に関しては、'license()' あるいは 'licence()' と入力してください。 

R は多くの貢献者による共同プロジェクトです。 
詳しくは 'contributors()' と入力してください。 
また、R や R のパッケージを出版物で引用する際の形式については 
'citation()' と入力してください。 

'demo()' と入力すればデモをみることができます。 
'help()' とすればオンラインヘルプが出ます。 
'help.start()' で HTML ブラウザによるヘルプがみられます。 
'q()' と入力すれば R を終了します。 

> 
```

# ソースビルド版OpenBLASを利用した時の効果を検証
デフォルトのOpenBLASはRのインストール時に既にビルド済みの状態のバイナリが格納されます。しかし、ソースからビルドしたOpenBLASを利用すると演算速度が改善するそうです。[参考](https://qiita.com/hoxo_m/items/aa04b9d3d7a32cb6a1a3#2-%E3%83%99%E3%83%B3%E3%83%81%E3%83%9E%E3%83%BC%E3%82%AF%E3%81%AE%E5%AE%9F%E8%A1%8C)の方法に従ってベンチマークを実行して演算速度の改善が確認出来るか検証します。

## デフォルトのOpenBLASを確認
[参考](https://qiita.com/hoxo_m/items/aa04b9d3d7a32cb6a1a3#1-%E7%8F%BE%E5%9C%A8%E3%81%AE-blas-%E3%81%AE%E7%A2%BA%E8%AA%8D)の方法に従って、R上で利用されている行列計算ライブラリのOpenBLASを確認します。以下は筆者の環境の例です。

```bash
$ ps aux | grep exec/R
yuhkiyano        23672   0.0  0.0 408628368   1664 s001  S+    4:09PM   0:00.00 grep exec/R
yuhkiyano        23119   0.0  0.3 408827424  58640 s000  S+    4:09PM   0:00.11 /Library/Frameworks/R.framework/Resources/bin/exec/R
```

```bash
$ lsof -p 23119 | grep 'blas\|lapack'
R       23119 yuhkiyano  txt    REG   1,17   193872           195488700 /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/lib/libRblas.0.dylib
R       23119 yuhkiyano  txt    REG   1,17  1713120           195488715 /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/lib/libRlapack.dylib
```

## ベンチマークの入手
行列演算の速度を測定出来る`R-benchmark-25.R`を用います。ベンチマークのスクリプトは以下から入手出来ます。

https://mac.r-project.org/benchmarks/

筆者は`wget`コマンドを用いてダウンロードしました。

```bash
wget https://mac.r-project.org/benchmarks/R-benchmark-25.R
```

## ベンチマークスクリプトの編集
ベンチマークスクリプトを開き、以下のコード(42行目)をコメントアウトします。行列の削除を実行するコードですが、この部分では不要です。このまま実行するとエラーになります。

```R:コメントアウトするコード
remove("a", "b")
```

## SuppDistsパッケージのインストール
乱数生成パッケージの`SuppDists`をインストールします。インストールしなくても実行出来ますが、パッケージがインストールされていないと警告が出ます。

```R:警告メッセージ
 要求されたパッケージ SuppDists をロード中です 
 警告メッセージ: 
 library(package, lib.loc = lib.loc, character.only = TRUE, logical.return = TRUE,  で: 
   ‘SuppDists’ という名前のパッケージはありません
```

### CRANミラーサイトの設定
CRANのミラーサイトが未設定の場合、パッケージインストール時にミラーサイトの選択を求めるプロンプトが毎回表示されます。これを防ぐためにホームディレクトリ上に`.Rprofile`を作成し、以下の様に追記します。

```R:.Rprofile
options(repos="https://cran.ism.ac.jp/")
```

 国内ミラーサイトの詳細は以下を参照して下さい。

http://www.okadajp.org/RWiki/?CRAN%E5%9B%BD%E5%86%85%E3%83%9F%E3%83%A9%E3%83%BC%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9

## XQuartzのインストール
`SuppDists`パッケージにはXQuartzが必要です。以下のコマンドを実行し、インストールします。インストール途中でルートパスワードを求められるので入力します。

```bash
brew install --cask xquartz
```

```bash
$ brew install --cask xquartz
==> Downloading https://formulae.brew.sh/api/cask.jws.json
############################################################################################################################################################### 100.0%
==> Downloading https://github.com/XQuartz/XQuartz/releases/download/XQuartz-2.8.5/XQuartz-2.8.5.pkg
==> Downloading from https://objects.githubusercontent.com/github-production-release-asset-2e65be/201858552/619d0c12-2b10-4965-8ac3-62058ea775f1?X-Amz-Algorithm=AWS4-
############################################################################################################################################################### 100.0%
==> Installing Cask xquartz
==> Running installer for xquartz; your password may be necessary.
Package installers may write to any location; options such as `--appdir` are ignored.
Password:
installer: Package name is 
installer: Installing at base path /
installer: The install was successful.
installer: The install requires logging out now.
🍺  xquartz was successfully installed!
```

インストールされていない場合、以下の様なエラーメッセージがインストール時に表示されます。

```bash
 警告メッセージ: 
 doTryCatch(return(expr), name, parentenv, handler) で: 
   共有ライブラリ '/Library/Frameworks/R.framework/Resources/modules//R_X11.so' を読み込めません: 
  dlopen(/Library/Frameworks/R.framework/Resources/modules//R_X11.so, 0x0006): Library not loaded: '/opt/X11/lib/libSM.6.dylib'
  Referenced from: '/Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/modules/R_X11.so'
  Reason: tried: '/opt/X11/lib/libSM.6.dylib' (no such file), '/Library/Frameworks/R.framework/Resources/lib/libSM.6.dylib' (no such file), '/Library/Java/JavaVirtualMachines/jdk-11.0.18+10/Contents/Home/lib/server/libSM.6.dylib' (no such file) 
```

### インストールの実行
Rのコンソールを起動し、`install.packages("SuppDists")`コマンドを実行します。

```R
$ r

R version 4.3.0 (2023-04-21) -- "Already Tomorrow"
Copyright (C) 2023 The R Foundation for Statistical Computing
Platform: aarch64-apple-darwin20 (64-bit)

R は、自由なソフトウェアであり、「完全に無保証」です。 
一定の条件に従えば、自由にこれを再配布することができます。 
配布条件の詳細に関しては、'license()' あるいは 'licence()' と入力してください。 

R は多くの貢献者による共同プロジェクトです。 
詳しくは 'contributors()' と入力してください。 
また、R や R のパッケージを出版物で引用する際の形式については 
'citation()' と入力してください。 

'demo()' と入力すればデモをみることができます。 
'help()' とすればオンラインヘルプが出ます。 
'help.start()' で HTML ブラウザによるヘルプがみられます。 
'q()' と入力すれば R を終了します。 

> install.packages("SuppDists")
 URL 'https://cran.ism.ac.jp/bin/macosx/big-sur-arm64/contrib/4.3/SuppDists_1.1-9.7.tgz' を試しています 
Content type 'application/x-gzip' length 332307 bytes (324 KB)
==================================================
downloaded 324 KB


 ダウンロードされたパッケージは、以下にあります 
 	/var/folders/3p/1yt5nmdx1zl_9l3p6_9tcv3r0000gn/T//RtmpyAStgd/downloaded_packages
```

これで漸くベンチマークスクリプト実行出来ます。

## ベンチマークの実行(デフォルトOpenBLAS)
まずはデフォルトのOpenBLASでの性能を測定してみます。以下のコマンドを実行するだけです。

```bash
cat R-benchmark-25.R | time R --slave
```

筆者の環境では以下の様な結果となりました。

```bash
$ cat R-benchmark-25.R | time R --slave
 要求されたパッケージ Matrix をロード中です 
 要求されたパッケージ SuppDists をロード中です 


   R Benchmark 2.5
   ===============
Number of times each test is run__________________________:  3

   I. Matrix calculation
   ---------------------
Creation, transp., deformation of a 2500x2500 matrix (sec):  0.277333333333333 
2400x2400 normal distributed random matrix ^1000____ (sec):  0.115 
Sorting of 7,000,000 random values__________________ (sec):  0.592 
2800x2800 cross-product matrix (b = a' * a)_________ (sec):  13.2793333333333 
Linear regr. over a 3000x3000 matrix (c = a \ b')___ (sec):  6.254 
                      --------------------------------------------
                 Trimmed geom. mean (2 extremes eliminated):  1.00885144039429 

   II. Matrix functions
   --------------------
FFT over 2,400,000 random values____________________ (sec):  0.0786666666666633 
Eigenvalues of a 640x640 random matrix______________ (sec):  0.416666666666667 
Determinant of a 2500x2500 random matrix____________ (sec):  1.71933333333333 
Cholesky decomposition of a 3000x3000 matrix________ (sec):  5.14366666666666 
Inverse of a 1600x1600 random matrix________________ (sec):  1.39166666666667 
                      --------------------------------------------
                Trimmed geom. mean (2 extremes eliminated):  0.998990493585409 

   III. Programmation
   ------------------
3,500,000 Fibonacci numbers calculation (vector calc)(sec):  0.0986666666666641 
Creation of a 3000x3000 Hilbert matrix (matrix calc) (sec):  0.110666666666674 
Grand common divisors of 400,000 pairs (recursion)__ (sec):  0.0823333333333286 
Creation of a 500x500 Toeplitz matrix (loops)_______ (sec):  0.0179999999999912 
Escoufier's method on a 45x45 matrix (mixed)________ (sec):  0.144999999999982 
                      --------------------------------------------
                Trimmed geom. mean (2 extremes eliminated):  0.0965134102123727 


Total time for all 15 tests_________________________ (sec):  29.7223333333333 
Overall mean (sum of I, II and III trimmed means/3)_ (sec):  0.459895060497375 
                      --- End of test ---

      146.69 real       145.83 user         0.75 sys
```

## ソースビルド版OpenBLASのインストール
ソースビルド版のOpenBLASをインストールします。

```bash
brew install --build-from-source openblas
```

以下の様な警告が出た場合、指示通りに実行するとインストールが完了します。

```bash
Warning: The post-install step did not complete successfully
You can try again using:
  brew postinstall openblas
```

## OpenBLASの入れ替え
デフォルトのOpenBLASは残しつつ、ソースビルド版のOpenBLASを格納します。以下のコマンドを実行します。

```bash:デフォルト版の名前変更
mv /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/lib/libRblas.dylib /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/lib/libRblas.dylib.org
```

```bash:ビルド版の格納
ln -s /opt/homebrew/opt/openblas/lib/libopenblas.dylib /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/lib/libRblas.dylib
```

## ベンチマークの実行
ベンチマークを再実行します。入れ替えの効果が出ている(高速化している)ことが結果から分かります。

```bash
$ cat R-benchmark-25.R | time R --slave
 要求されたパッケージ Matrix をロード中です 
 要求されたパッケージ SuppDists をロード中です 


   R Benchmark 2.5
   ===============
Number of times each test is run__________________________:  3

   I. Matrix calculation
   ---------------------
Creation, transp., deformation of a 2500x2500 matrix (sec):  0.279666666666667 
2400x2400 normal distributed random matrix ^1000____ (sec):  0.112666666666667 
Sorting of 7,000,000 random values__________________ (sec):  0.601 
2800x2800 cross-product matrix (b = a' * a)_________ (sec):  0.151 
Linear regr. over a 3000x3000 matrix (c = a \ b')___ (sec):  0.247333333333333 
                      --------------------------------------------
                 Trimmed geom. mean (2 extremes eliminated):  0.21859158274215 

   II. Matrix functions
   --------------------
FFT over 2,400,000 random values____________________ (sec):  0.0810000000000001 
Eigenvalues of a 640x640 random matrix______________ (sec):  1.328 
Determinant of a 2500x2500 random matrix____________ (sec):  0.397666666666667 
Cholesky decomposition of a 3000x3000 matrix________ (sec):  0.368666666666667 
Inverse of a 1600x1600 random matrix________________ (sec):  0.71 
                      --------------------------------------------
                Trimmed geom. mean (2 extremes eliminated):  0.470403419369798 

   III. Programmation
   ------------------
3,500,000 Fibonacci numbers calculation (vector calc)(sec):  0.0993333333333339 
Creation of a 3000x3000 Hilbert matrix (matrix calc) (sec):  0.110666666666667 
Grand common divisors of 400,000 pairs (recursion)__ (sec):  0.0759999999999993 
Creation of a 500x500 Toeplitz matrix (loops)_______ (sec):  0.0173333333333332 
Escoufier's method on a 45x45 matrix (mixed)________ (sec):  0.0940000000000012 
                      --------------------------------------------
                Trimmed geom. mean (2 extremes eliminated):  0.0891960218173493 


Total time for all 15 tests_________________________ (sec):  4.67433333333334 
Overall mean (sum of I, II and III trimmed means/3)_ (sec):  0.209322765201754 
                      --- End of test ---

       23.33 real        86.63 user         2.59 sys
```

# まとめ
久方振りにMacにRをインストールしました。Homebrewを用いてインストールしたアプリケーションが`/opt/homebrew`直下に格納される仕様に変更された影響で、ファイルの場所を捜索するのに少々手間取りましたが、無事OpenBLAS入れ替えによる高速化も実現出来ました。

# Reference
https://glong355.hatenablog.com/entry/2020/10/24/164623

https://qiita.com/hoxo_m/items/aa04b9d3d7a32cb6a1a3

https://mac.r-project.org/benchmarks/

https://docs.oracle.com/cd/E85960_01/OREAD/apx_packagetips.htm

http://www.okadajp.org/RWiki/?CRAN%E5%9B%BD%E5%86%85%E3%83%9F%E3%83%A9%E3%83%BC%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9