AlteryxのRツールでパッケージを追加したがうまく読み込めない!?そんな時は…

こんにちは、小澤です。

AlteryxでRツールをゴリゴリに使っている場合、 Alteryx Predictive Toolsで標準に含まれているもの以外にもパッケージを追加して利用していることかと思います。

今回は、そんな時にAlteryxのRツールでのみ起こるエラーとその解決方法について解説します。

Rツールを使った時だけパッケージの読み込みに失敗の原因は...

AlteryxのRツールから利用するR環境には任意のパッケージを追加できます。 これは install.packages() を使って行うことも可能です(ただし、repos引数が必須になります)し、Install R Packagesを利用することも可能です。 これらのパッケージはユーザ個別のパスにインストールされます。

インストールしたパッケージをRツールから読み込もうとした際に以下のようなエラーが出るケースがあります。

Alteryx Predictive Toolsに含まれるR.exeを直接起動したり、RStudioが利用するRをAlteryxに含まれるものに指定してライブラリを読み込んだ際には、エラーが起きず正常に読み込めます。

これは、libraryrequire 関数でライブラリを読み込もうとした際に、依存ライブラリがバージョンが要件を満たしていない古いバージョンであることを示しています。 ここで対象となっているは、 {dplyr} パッケージですが、他のものである可能性もあります。

なぜこのようなことになっているかというと、Alteryx Predictive Toolsに含まれるパッケージ郡とRツールの挙動によるものとなっています。

Alteryx Predictive Toolsをインストールすると、 その中に含まれる様々なRに依存したツールに必要なパッケージもインストールされます。 これらはインストール先は、Admin版であれば C:/Program Files/Alteryx/R-3.6.3/library となります。

一方、ユーザが後から追加したものは、 C:/Users/<ユーザ名>/Documents/R/win-library/3.6 などとなります。 Predictive Toolsに含まれるものとは別バージョンの依存パッケージがある場合はそれらもここにインストールされます。

先ほどの例であれば、dplyr 0.8.5がシステムのフォルダにインストールされており、1.0.0がユーザのフォルダにインストールされた状態となります。

さて、なぜAlteryxのRツールを使った時のみ、このような状況が起こるかというと、Rツール実行時に行われている処理に依存しています。 Rツール内に記述された処理が実行される前に、以下の処理が実行されています。

  1. .libPathsの変更
  2. {AlteryxPredictive} の読み込み

1に関しては、Rをそのまま実行した際と、Rツールで実行した際での .libPaths() の違いで確認できます。

  • Rを単体で使った場合
> .libPaths()
[1] "C:/Users/<ユーザ名>/Documents/R/win-library/3.6" "C:/Program Files/Alteryx/R-3.6.3/library"
  • AlteryxのRツールを使った場合
Info: R (2): [1] "C:/Program Files/Alteryx/R-3.6.3/library"             
Info: R (2): [2] "C:/Users/<ユーザ名>/AppData/Roaming/Alteryx/R-library"
Info: R (2): [3] "C:/ProgramData/Alteryx/R-library"                     
Info: R (2): [4] "C:/Users/<ユーザ名>/Documents/R/win-library/3.6"

2は、AlteryxのRツールが出力する以下のログから確認できます。

Info: R (2): Attaching package: 'AlteryxPredictive'

これらの状況から、何が起こってるかというと、AlteryxPredictiveを読み込む際に依存ライブラリはAlteryx Predictive Toolsがインストールされているフォルダに含まれてるものを利用している。 そのため、同じライブラリの別バージョンに依存したパッケージを読み込もうとした際にエラーが発生する、ということになります。

バージョンの違いによって、Alteryx Predictive Toolsに含まれるツールが動かなくなるのを防ぐためにこのような仕組みを導入してると思われます。

パッケージを利用するには?

エラーが発生する原因はわかりましたが、どうすればこれが解決できるのでしょうか? いくつかの方法を紹介していきます

システムライブラリのアップデート

Alteryx Communityには、以下のような回答が存在しています。

ここでの、解決手法はPredictive Toolsに含まれているライブラリのアップデートをするというものです。 Admin版をインストールしている場合、管理者権限が必要なパスにパッケージを入れることになるため、「R.exeを管理者権限で実行」となっています。

これで、解決するのですが...ですが... 個人的にシステムのライブラリを変更するというはあまりやりたくない方法でした... (なんかあってもAlteryx Predictive Toolsをインストールしなおせば元に戻せるんですけどね...)

.Rprofileで読み込んでしまう

Rでは、.Rprofileというファイルを用意して、Rを起動するタイミングで実行するスクリプトを記述しておくことが可能です。 この.Rprofileを用意して、AlteryxのRツールを使った場合には以下の順序で処理が実行されます。

  1. .Rprofileに記述された内容の実行
  2. Rツール実行時の処理(.libPathsの変更とAlteryxPredictiveの読み込み)の実行
  3. Rツール内に記述された処理の実行

.Rprofileに記述された処理が最初に実行されるため、ここにライブラリの読み込み処理を記述することで、 .libPathが変更される前にユーザディレクトリにインストールされたバージョンの依存ライブラリを利用して読み込まれます。

これで、システムに変更を加えなくてよくなりました...なりましたが... まだ、気になる点があります...

システムそのものには変更は加わっていないものの、Predictive Toolsに含まれるツールで利用しているRツール内でも実行されます。 これらのツールで正常に動かなくなるものが出てくるかもしれませんし、今はなくてもAlteryxのバージョンアップに伴ってパッケージのバージョンが変更された際には同様の現象やRツール自体が動かなくなる可能性も否定できません...

あと、Alteryx以外でRを使ってる場合にはそちらでも読み込まれますので困るかもしれません...

ライブラリをUnloadしよう

さて、上記2種類の方法に納得いってないことからも分かる通り、 私はわがままなのでRツールを使ったワークフローを作成するに際して、他のRツールを使ったワークフローにまで影響を及ぼす可能性のあることをしたくないです。 というわけで、最後に紹介する手段は「Rツール内で実行時の処理を無かったことにする処理を記述する」です。

AlteryxPredictiveとそれが依存するライブラリを読み込み前の状態に戻して、.libPathも書き換えます。 とはいえ、「他から依存してるからUnload」できないというエラーが出たりします(AlteryxPredictiveの依存パッケージ情報は見つけられませんでした...)。

というわけで、頑張りました!!

Rツールの先頭に以下の処理を記述しましょう。

# この辺のライブラリをこの順でUnloadする
unload_pkgs <- c(
  "AlteryxPredictive", "dplyr", "tidyselect", "ggplot2", 
  "scales", "lifecycle", "tibble", "purrr",
  "flightdeck", "DT", "htmlwidgets", "htmltools",
  "pillar", "rlang"
)
sapply(unload_pkgs, unloadNamespace)

# Alteryxによって書き換えられた後の.libPathではユーザライブラリ用のパスが最後にあるので逆順にしちゃう
# もっと細かく指定したい場合は、それでもいい
.libPaths(rev(.libPaths()))

# 読み込みたいライブラリを読み込む
library(tidyverse)
...
...

# read.Alteryxやwrite.Alteryxを使うためにAlteryxPredictiveも最後に読み込む
library(AlteryxPredictive)

# 後は実行したい処理を記述
...
...

他のライブラリを読み込む場合には別途指定するものが増える場合もありますが、エラーメッセージを見つつ対象を増やしていけばなんとかなります。

この方法でも、Alteryxのバージョンアップに際してRツール内の記述を変更する必要が出る可能性はまだ残っていますが、 その辺は、パッケージのバージョンアップ時の宿命として許容範囲としましょう。

おわりに

今回は、AlteryxのRツールでパッケージを追加する際に発生するバージョンが合わないエラーの原因と対処方法について書きました。

Rツールをゴリゴリ使っていきましょう!!