AlteryxのRツールを使った開発を便利にするJeeves

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、小澤です。

需要があるのかないのかわからないAlteryxのRツールを使った開発Tipsが今回も始まります。 元々Alteryxはコードフリーが売りのため、そんなに使う人は多くないんじゃないかと思われるツールなうえ、最近ではコードフレンドリー側の機能でSpark DirectツールやPythonツールなども登場しより一層肩身の狭い思いをしています(?)

そんなRツールですが、入出力など一部の補完以外はただひたすらRのコードを書くためのフォームがデカデカと存在しているという何とも一見さんお断り感あふれる素敵ツールです。 素敵なRツールですが、普段Rを書くときにRStudioなどのIDEを使っているとツール内だけで処理を記述するのはなかなかつらいですし、R使いとしてはデフォルトがインタラクティブくらいなノリが欲しくなります。

そこで、今回は一般R使いがAlteryxのRツールを便利に使えるライブラリを紹介します。

公式にあったJeeves

AlteryxのGithubリポジトリにjeevesというものが存在しています。

Alteryxの内部にはデフォルトで存在する様々なツールがRに依存しているため、さすが中の人はこういった便利機能を用意しているというように見受けられます。

READMEのGifアニメからもわかるようにRツールとRStudio(任意のエディタでOK)との間でコードをやり取りするためのツールとなっています。

Gifアニメは最終的な状態で止まってくれないので、流れを書くと以下のようになります。

  1. Rツールを使ったワークフローを作成する
  2. ワークフローからRのコードを抽出する
  3. RStudioでコードを書く
  4. 書いたコードをワークフローに出力する

となっています。

インストール

Jeevesを利用するには、まずパッケージをインストールする必要があります。 CRANでは配布されていないのでGithubのリポジトリから取得します。

install.packages("jeeves", repos = 'http://alteryx.github.io/jeeves')

Githubからの取得なので、devtoolsがインストールされている場合はそちらを利用しても問題ありません。

devtools::install_github("alteryx/jeeves")

使ってみる

では実際に使ってみましょう。

テンプレートの作成

先ほど紹介したプロセスでは、最初にワークフロー中のRツールの中身を取得するところから始まっていますが、テンプレートとしてAlteryxのマクロとRのコードを生成することも可能です。

テンプレートの生成方法は以下のようになります。

library(jeeves)
scaffoldWorkflow(name = "jeeves_test", outDir = "test")

このコードを実行したRのワーキングディレクトリ以下にtestというディレクトリが作成され、そこにjeeves_test.yxmcとjeeves_test1.Rという2つのファイルが作成されます。

以下のようなエラーが出るかもしれませんが、正常にファイルが出力されます。

Error in editor(file = file, title = title) :
argument "name" is missing, with no default

jeeves_test.yxmcの中身は以下のようになっており、3つインターフェースツールとRツールが配置されています。

jeeves_test1.RとRツール内のコードは同じもので、以下のような内容になっています。

#' ## Read
#'
#' The first step is to read configuration and inputs that stream in from
#' Alteryx. For this code to be portable, we need to provide defaults that will
#' be used when the R code is not run inside an Alteryx workflow.
#'
#' ### Configuration
## DO NOT MODIFY: Auto Inserted by AlteryxJeeves ----
library(AlteryxPredictive)

config <- list(
 `bar_color` = dropdownInput('%Question.bar_color%' , 'steelblue'),
 `num_bins` = numericInput('%Question.num_bins%' , 10),
 `yvar` = dropdownInput('%Question.yvar%', 'price')
)
options(alteryx.wd = '%Engine.WorkflowDirectory%')
options(alteryx.debug = config$debug)


##----

#' ### Defaults
#'
#' These defaults are used when the R code is run outside Alteryx
defaults <- list(
  d1 = data.frame(carat = runif(100), price = runif(100)*100)
)

#' ### Inputs
#'
#' This is a named list of all inputs that stream into the R tool.
inputs <- list(
  d1 = read.Alteryx2("#1", default = defaults$d1)
)


#' ## Process
#'
#' The next step is to process the payload (configuration and inputs) and return
#' outputs. The `process` function needs to be pure (no side effects) so that we
#' can also write unit tests in R.
#'
#' It is advisable to to write small, simple helper functions and
#' string them together to construct the `process` function. These helper
#' functions should be thrown into an R package so that they can be documented
#' and unit tested.

process <- function(config, inputs){
  d <- inputs$d1
  out1 <- d
  out2 <- function(){
    hist(
      d[[config$yvar]],
      breaks = config$num_bins,
      col = config$bar_color,
      main = paste('Histogram of', config$yvar),
      xlab = config$yvar
    )
  }
  list(out1 = out1, out2 = out2)
}

outputs <- process(config, inputs)

#' ## Write
#'
#' The final step is to write outputs to the Alteyx stream. We use the `output`
#' object generated previously and then write them out to the desired output

write.Alteryx2(outputs$out1, 1)
AlteryxGraph2(outputs$out2(), 3)

処理内容に関して、何か意味のある分析をしているというわけではないですが、簡単に解説しておくと

  • Alteryxの1つ前のツールから入力を受け取る
  • Rツールの1つ目の出力は入寮と同じもの
  • Rツールの2つ目の出力は入力データのヒストグラムを作成する
  • ヒストグラムに使う列や色などの項目はインターフェースツールから受け取る

となっています。

Rツールのコードをスクリプトに変換

さて、ではここから順にJeevesでの開発の流れを見ていきましょう。

まず最初にRツールのコードをスクリプトとしてファイルに変換します。 なぜこれが最初かというと、ワークフロー側でRツールに至るまでの処理の流れやインターフェースツールの配置などのおおよその形はできている状態でRツール内での処理の開発が始まるという前提になっているからかと思われます。 ここから始めるのは必須ではないので、Rのコードを先に書いてRツールに流し込むような使い方も可能です。

Rツール内のコードを取得する処理にはextractRCode関数を利用します。 引数に対象のワークフローを指定してコードを取得します。

extractRcode("test/jeeves_test.yxmc")

このコードはRツールに記述するのではなく、別途Rから実行します。 先ほどscaffoldWorkflowを実行した環境などから処理を実行すると、jeeves_test1.Rというファイルが生成または上書きされます。

RStudioでコードを書く

抽出されたスクリプトを編集してRの処理を実装していきます。

このプロセスでは通常と同様にRの処理を実装可能です。 ただし、Alteryx側で利用可能な以下のような関数は通常のRのコードでは使えません。

  • read.Alteryx
  • write.Alteryx
  • AlteryxGraph

Alteryx固有のツールとしての入出力を扱う関数です。 これらに対応する末尾に「2」のついた関数を利用することでいずれの環境でもまま実行可能な関数として動作します。

library(AlteryxPredictive)
read.Alteryx2("#1",
    default = data.frame(x = c(1, 2), y =c(1, 4)))

read.Alteryx2関数ではdefault引数でAlteryxからの入力を受け取れない場合のデフォルト値を指定します。 write.Alteryx2やAlteryxGraph2関数はAlteryxの出力先がない環境の場合、標準出力が対象となるため引数に変更はありません。

これらの関数は「2」を消すことなくそのままAlteryxのRツールでも実行可能です。

また、AlteryxのRツールではインターフェースツールに設定された値などを以下の要領で取得可能です。

text1 <- '%Question.text1'

ここでは、Text Boxツールにtext1という名前を付けたものとしています。 こちらの値もAlteryx固有の表現となっており、またRツール外に書かれたコードでは取得する方法がないためそのままではうまく実行できません。

これに対応するために以下のように変数名とデフォルト値を設定可能な関数が用意されています。

  • numericInput
  • textInput
  • dropdownInput
  • listInput
  • checkboxInput
  • radioInput
  • selectInput

それぞれ各インターフェースツールから入力される値に対応してます。 これらの関数を使って変数とデフォルト値のlistを作成して利用すると以下のように記述できます。

# 設置されたインターフェースツールの変数とデフォルト値の組み合わせ
input <- list(
  breaks = numericInput('%Question.breaks%' , 5),
  color = textInput('%Question.color%' , 'steelblue'),
  debug = checkboxInput('%Question.debug%' , FALSE)
)

# listから値を取得することでデフォルト値か
# インターフェースから背呈された値のどちらかを取得する
selected.color <- input$color

また、グループ化された複数のラジオボタンのうち選択されたものを取得する方法として、findTrueInput関数も用意されています。

# ラジオボタンにおける選択肢を設定
radio.select <- list(
  dist.normal = radioInput("%Question.normal%", TRUE),
  dist.uniform = radioInput("%Question.uniform%"),
  dist.exponential = radioInput("%Question.exp%")
)
# ラジオボタンの中の選択された値
dist <- findTrueInput(radio.select, 'dist')

こういった仕組みを利用することで、Rツール内でも外部のRでも実行可能な処理として記述することが可能になります。

書いたコードをワークフローに出力する

最後に外部のスクリプトとして書いた処理をワークフロー中のRツールにもっていくinsertRcode関数を紹介します。 こちらも使い方は非常に簡単です。

insertRcode('test/jeeves_test.yxmc', 'test/jeeves_test1.R')

これで、jeeves_test1.Rに記述されたスクリプトがjeeves_test.yxmc内のRツールにコピーされます。 ワークフローはそのまま実行可能です。

このように、Jeevesを利用すると"Rツールから外部スクリプトへ"と"外部スクリプトからRツールへ"が繰り返し行えます。 コピペをして一部処理の内容の変更をして、という作業をすることなく 開発は便利なIDEで行いつつワークフロー上で動かしてみながら処理内容を確認するという使い方が可能になります。

おわりに

今回は、AlteryxのRツールを使った開発を便利にするJeevesというものを紹介しました。 R派の皆さんや、誰かがRで作ったコードをAlteryxに移植しないといけなくなった場合などで便利に使えるかと思います。

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

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

alteryx_960x400