AlteryxでRツールを使ったマクロを作るときの設定値の受け取り方
こんにちは、小澤です。
先日、内部でRツールを使っているマクロを公開しました。
その時にふと思ったのです。 そういえばマクロでRツールを利用する際に、インターフェースツールで設定された値をRツールで受け取る方法の記事を書いていないなぁ、と
そこで今回はその方法について書かせていただきたいと思います。
インターフェースで設定された値とワークフロー定数
ワークフロー定数とユーザ定義定数
さて、Rツールで設定値を受け取るためのファーストステップとして、 まずはワークフロー定数というものを紹介します。
これは、ワークフローの設定にて「Workflow」タブから確認できます。
「Constants」となっている部分がワークフロー定数です。
ワークフローのファイル名や保存先、利用しているAlteryxのバージョンなどが表示されてるのがわかるかと思います。
このワークフロー定数はユーザ定義で追加することも可能です。 右側にある「+」を押すと以下のようにTypeにUserと入った項目が追加されます。
NameとValueにはそのまま値を入力できるので、任意の値を入れることでユーザ定義定数が作成されます。
ワークフロー定数を定義できるのはいいけど、どのように使うのでしょうか? これらは、例えばFormula式で列名を入力するのと同じように利用可能です。 使い方としては、[<Type>.<Name>] で指定します。 以下のように「[」を入力した際の補完候補にも出てきています。
ユーザ定義定数に関しては「#」の列にチェックを入れることで、文字列ではなく数値として認識させることも可能です。
ワークフロー定数やユーザ定義定数の使い道としてどのようなものが考えられるでしょうか? いくつか例を挙げてみましょう。
- Engine.GuiInteractionを利用して、Designerから実行した場合とServerから実行した場合で処理内容の一部を変える
- Engine.TempFilePathを利用して一時ファイルとして保存されたものを動的に取得
- ユーザ定義定数で消費税率を定義しておき、変更があった場合はFormula式すべてではなく定数のみ書き換えればいいようにしておく(※ ただし、軽減税率対応は難しい)
- BatchマクロやIterativeマクロではEngine.IterationNumberで現在のループ回数を取得可能
インターフェースツール定数
ここまでの内容は、本記事のテーマにあまりつながりそうにないと感じてる方もいるかもしれません。 ここから、いよいよインターフェースツールの話が出てきます。
まずは、ワークフローに適当なインターフェースツールを配置してみます。 すると、定数一覧に以下のようにTypeがQuestionとなっている項目が出現します。
実は、インターフェースが配置されると、対応する定数が定義され、マクロやAnalytic App実行時に設定された値はここにも設定されます。
(※ プログラムに詳しい方であれば、Questionは定数じゃなくて変数なんじゃないか?と思われるかもしれません。他のTypeの値は定数であることは間違いないのですが、わざわざ項目を分ける必要はなさそうなのと、Questionに関しても実行中に書き換えられることはないため、事実上定数と同等と考えられます。)
インターフェースツールによって配置されたQuestionのName, Valueもユーザ定義定数と同様にこの設定から変更可能です。 ただし、Formulaツールから直接変数として利用することはできないのでその点はご注意ください。これに関しては、従来通りツールに接続して[#1]のようなコネクション名の指定で行ってください。
インターフェースのNameはここで変更するほかにツールの設定からも変更可能です。 左側のメニュからAnnotation(上から4番目のやつ)を選択してNameに名前を入れます。
また、Questionに対するValueを設定した場合、マクロやAnalytic Appとして使った際には設定値で書き換わってくれますが、ワークフローとして実行した際にはデフォルト値として動いてくれるので、動作確認などをする際に便利です。
そしていよいよ、Rツールから使う
さて、ついに必要な事前準備が整いました。 ここからは、本題であるインターフェースツールの設定値をRツールから使う方法を解説していきます。
とはいえ、これは実は非常に簡単です。 Rツール内で、%<Type>.<Name>%のように記述するのみです。 定数の種類にかかわらずインターフェースツールとRツールを接続する必要もありません。
以下のような処理をワークフローとして実行した際の結果を確認してみましょう。
engine.val <- '%Engine.Version%' user.val <- '%User.test%' question.val <- '%Question.Text Box (5)%' df <- data.frame(engine=engine.val, user=user.val, question=question.val) write.Alteryx(df, 1)
結果は以下のようになります。
インターフェースツールに関してはデフォルト値が設定されていないので、空文字になっています。 Valueが設定されている項目に関しては、その値が取得で来ているのが確認できます。 同じ処理をマクロにして、インターフェースツールに値を入れると以下のようにその値が取得できているのが確認できます。
Rツールからこれらの定数を使う際に注意点があります。 これらは、実行時には設定された値に単純に置き換えれられるのみ、となっています。
例えば、以下のような定数を作成していたとしましょう。
Type | Name | Value |
---|---|---|
User | a | 1 |
User | b | x |
User | c | y |
これに対してRツールの記述は以下のようにしています。
x <- "test" a <- %User.a% b <- %User.b% c <- %User.c%
先ほどとの違いは、各定数をクオートでくくって文字列にしていない点となります。 定数のValueの値がそのまま利用されるため、これは実行時には以下のような内容の処理が実行されます。
x <- "test" a <- 1 b <- x c <- y
変数a, b, cはそれぞれ以下のような動きとなります。
- 変数aはそのまま数値の1が代入される
- 変数bは変数xの値が参照され、"test"が代入される
- 変数cは変数yの値を代入しようとするが、存在しないためエラーとなる
こういった動きとなるため、定数で定義した値を文字列として変数に入れたいときは必ずクオートでくくるようにしてください。
おわりに
今回は、AlteryxのRツールで定数を利用する方法と、Alteryxにおける定数定義について解説しました。 本記事はRツールで利用することをメインとしたものにしていますが、前半の内容はRツールとは関係なく利用することも可能です。
Alteryxの導入なら、クラスメソッドにおまかせください
日本初のAlteryxビジネスパートナーであるクラスメソッドが、Alteryxの導入から活用方法までサポートします。14日間の無料トライアルも実施中ですので、お気軽にご相談ください。