R言語スカラー関数 1

以下の例では、すべての文字入力列の長さの合計を返す関数を作成している。

コード

R AEでは、ユーザーから提供される主なオブジェクトは「nz.fun」と呼ばれる関数である。 これはメインのAEループをカプセル化し、R AE APIを使用してデータの受信と出力を行う。 次の例は、Rにおける'applyop実装である。

/tmp/applyop.Rファイルに以下のコードを入力する:
nz.fun <- function () {
while(getNext()) {
op <- getInputColumn(0)
X <- c()
for (i in seq(1, inputColumnCount()-1)) {
x <- as.numeric(getInputColumn(i))
if (!is.null(x) && !is.na(x))
X <- append(X, x)
}
if (op != '+' && op != '*')
stop('incorrect operator: ', op)
setOutputInt32(0, eval(parse(text=paste(X, collapse=op))))
outputResult()
}
}

メインループは、'getNext() falseを返した時点で終了する。 各入力行は、インデックスで指定された列の値を返す'getInputColumn()でアクセスされる。 最初の列のインデックスは0で、最後の列のインデックスは'inputColumnCount()-1である。 出力値は「setOutput*関数で扱われ、アスタリスクは特定のデータ型識別子を表す。 出力値をデータベースに送るには、「outputResult()関数を呼び出す必要がある。

エラーが発生した場合は、R 標準の 'stop()関数を呼び出すか、AE API 関数の 'userError() を使用する。 どちらの関数もプログラムの実行を中断し、エラーメッセージを呼び出し元に返す。

コンパイル

コードを次のようにコンパイルする:
/nz/export/ae/utilities/bin/compile_ae --language r \
--version 3 --template compile --user nz --db dev \
/tmp/applyop.R

コンパイル・ステップでは、入力ソース・ファイルは標準的なR APIを使ってシリアライズされ、さらに実行できるように準備される。 出力は、データベースとユーザー名に応じて、ホストおよびSPUからアクセス可能な定義済みのパスに保存される。

登録

コンパイルが完了したら、コードを登録しなければならない。 登録ステップについては、以下の条件が適用される:
  • テンプレート名にはudfを指定しなければならない。
  • ユーザー名、データベース名、および出力タイプを含むUDX署名は、コンパイル値と一致している必要があります。
  • 実行ファイル名は、コンパイル・ステップのソース・ファイル名と一致していなければならない。
コードを次のように登録する:
/nz/export/ae/utilities/bin/register_ae --language r \
--version 3 --user nz --db dev --template udf \
--sig 'applyop(VARARGS)' --return INT4 --exe applyop.R

実行中

登録したUDAPを実行すると、次のような結果が得られる:
SELECT applyop('+', 4, 10);
APPLYOP
---------
14
(1 row)
SELECT applyop('*', 3, 5);
APPLYOP
---------
15
(1 row)
次の例はエラー処理を示している:
SELECT applyop('-', 3, 5);
ERROR: Error in function () : incorrect operator: -