AlteryxでRのライブラリ追加と.libPathsの話

こんにちは、小澤です。

AlteryxでRツールに依存した独自マクロを作成する際、パッケージを追加したい時があります。 これは、例えば以下のようなワークフローを利用したり、Rから直接install.packagesしたりといった方法で実現可能です。

さて、ここで1つ気になる点があります。 インストールしたRのパッケージはどこに保存されているのでしょうか?

なぜこんなことを気にするかというと

  • 作成したマクロを配布する際にどのパッケージを追加で入れるか知る必要がある
  • AlteryxのPredictive Toolとは別にRがインストールされている環境でパッケージが競合するかもしれない

といったことが考えられます。 前者は、以下の記事で書かせていただいた通りyxiファイルとして提供する場合、 中身に含める必要があります。

さて、前置きが長くなりましたが、 今回はRのパッケージがどこに保存されて、どこから読み込まれるのか?という話をしたいと思います。

Rのライブラリと.libPaths関数

ここからはAlteryxに限定した話ではありませんが、Rにおけるライブラリの保存・読み込み先の話をしたいと思います。

Rがライブラリの保存先として認識している場所は、.libPath関数を引数なしで呼び出すことで確認可能です。

> .libPaths()
[1] "C:/Program Files/Alteryx/R-3.4.4/library"
[2] "C:/Users/<user name>/AppData/Roaming/Alteryx/R-library"
[3] "C:/ProgramData/Alteryx/R-library"     
[4] "C:/Users/<user name>/Documents/R/win-library/3.4"

この出力結果はAlteryxのRツールでやってみたものになります。

1行目はRのインストール先のライブラリ保存先となっています。 ここに保存されたライブラリはPCにログイン可能なすべてのユーザに利用可能です。 少し飛びますが、4行目は、ユーザ固有のライブラリ保存場所となっています。 こちらは現在のログインユーザ限定で利用可能な保存先となっています。

2, 3行目はそれぞれに対応するAlteryx用のパスとなります。

続いて実際にパッケージのインストールや読み込みの際の動きを確認しましょう。

パッケージインストール時の挙動

Rでパッケージをインストールする際にはinstall.packages関数を利用します。

# AlteryxのRツールで実行する場合はrepos引数が必須
> install.packages("tidyverse", repos = "https://cran.rstudio.com/")

このように指定すると、.libPaths関数の出力結果の一番上のパスにパッケージがインストールされます。

通常の方法でRを起動した際には、ユーザ用のパスとなっていますが、 Alteryxでは、一番上がRのインストール先のlibraryフォルダとなっています。 そのため、管理者として実行していないとインストールに失敗します。 これは、Alteryxに標準で含まれるツールが利用するライブラリのバージョンを固定するためのものと思われます。

インストール先は変更することが可能です。 パッケージのインストール先を指定したい場合は、lib引数を使います。

> install.packages("tidyverse", repos = "https://cran.rstudio.com/", lib = "C:/Users/<user name>/Documents/R/win-library/3.4")

ただし、.libPaths関数の出力に含まれていないパスの場合、読み込み時にも指定が必要となるのでご注意ください。

ライブラリ読み込み時の挙動

library関数やrequire関数を使ってライブラリの読み込みを行う際にも同様に.libPaths関数が出力するパスから読み込まれます。

> library(tidyverse)

ライブラリの読み込みは、これらのうちいずれかにパッケージがインストールされてれば成功します。 同じライブラリが複数のフォルダにある場合は.libPaths関数の出力順で上にあるものが優先されます。

例えば以下の環境では、Alteryxで標準に含まれるdplyr 0.7.4のほかにユーザ用のライブラリにdplyr 0.8.0.1がインストールされています。 Rをそのまま実行した場合と、AlteryxのRツールから実行した場合の動きの違いを見てみましょう。

  • Rを直接実行する
    # .libPaths関数の出力としてユーザライブラリの方が上
    > .libPaths()
    [1] "C:/Users/<user name>/Documents/R/win-library/3.4"
    [2] "C:/Program Files/Alteryx/R-3.4.4/library"       
    > packageVersion("dplyr")
    [1] ‘0.8.0.1’
    
  • AlteryxのRツールから実行する
    # .libPaths関数の出力としてシステムライブラリの方が上
    > .libPaths()
    [1] "C:/Program Files/Alteryx/R-3.4.4/library"
    [2] "C:/Users/<user name>/AppData/Roaming/Alteryx/R-library"
    [3] "C:/ProgramData/Alteryx/R-library"
    [4] "C:/Users/<user name>/Documents/R/win-library/3.4"
    > packageVersion("dplyr")
    [1] '0.7.4'
    

ライブラリ実行時の読み込み先パスを指定するには、lib.loc引数を使います。

> packageVersion("dplyr", lib.loc="C:/Program Files/Alteryx/R-3.4.4/library")
[1] ‘0.7.4’
> library(dplyr, lib.loc = "C:/Program Files/Alteryx/R-3.4.4/library")

ライブラリの読み込み先を変更する

パッケージのインストール先やライブラリ読み込み先と.libPaths関数との関係はここまででご理解いただけたかと思います。

しかし、"標準に含まれているパスでは都合が悪いので別なパスを使いたい"といった状況の時に毎回指定するのは面倒ですね。 そんな時には、.libPaths関数に引数としてパスを渡すことで、そこで指定したパスとシステムのパスのみに変更することが可能です。

> .libPaths("C:/Users/<user name>/AppData/Roaming/Alteryx/R-library")
> .libPaths()
[1] "C:/Users/<user name>/AppData/Roaming/Alteryx/R-library"
[2] "C:/Program Files/Alteryx/R-3.4.4/library"

既存の値に追加したい場合は、それを含めたベクトルとして渡します。

> .libPaths(c(.libPaths(), "C:/Users/<user name>/AppData/Roaming/Alteryx/R-library"))
> .libPaths()
[1] "C:/Users/<user name>/Documents/R/win-library/3.4"
[2] "C:/Program Files/Alteryx/R-3.4.4/library"     
[3] "C:/Users/<user name>/AppData/Roaming/Alteryx/R-library"

.Rprofileにこの情報を記述しておくことで常にこのパスを利用する、という使い方も可能です。

複数のRがインストールしてある環境でのライブラリ読み込み先

このようにRが利用するライブラリに関しては.libPaths関数で確認や変更が可能です。

では、AlteryxのPredictive Toolのほかに別途Rをインストールしている、といった状況の時にはどうなるのでしょうか? システムライブラリ関してはRのインストール先に依存するため、異なるRであれば、.libPaths関数で意図的に設定しない限りはそれぞれ別物となります。

一方、ユーザライブラリは"C:/Users//Documents/R/win-library/3.4"のようになっているため、 同じパスが参照される可能性があります。 Alteryxではライブラリ読み込み時にシステムライブラリのパスが優先されるため、標準で含まれるツールのみを利用している場合は問題ないですが、個別にRを使ったワークフローを作っているような場合は注意が必要です。

また、.Rprofileで.libPaths関数を使ってパスを変更しているような場合には、Alteryxを含めてすべてのR環境でその設定が反映されるため、ご注意ください。

おわりに

今回は、Rにおけるライブラリの保存先について解説しました。 Alteryx要素少なめではありましたが、Rツールを使った自作マクロを作りたいという夢を持っている人などは参考にしていただけるといいかと思います。

Alteryxの導入なら、クラスメソッドにおまかせください

日本初のAlteryxビジネスパートナーであるクラスメソッドが、Alteryxの導入から活用方法までサポートします。14日間の無料トライアルも実施中ですので、お気軽にご相談ください。

alteryx_960x400