自分独自に定義した関数(カスタム関数)を、計算式エディタの関数リストに追加することができます。また、自分独自の表示形式(カスタム表示形式)や自分独自の変換(カスタム変換)も定義することができます。これらの機能は、現在のJMPセッションの中でのみ使用できる点に注意してください。JMPを再起動すると、以前に定義したカスタム関数・カスタム変換・カスタム表示形式は使用できなくなります。セッションごとに定義し、追加しなければなりません。これを簡単に行うには、それらの定義をアドイン、またはJMP起動時に毎回実行される起動スクリプトで行ってください。
カスタム関数を新たに定義するには、New Custom Function()を使います。関数を定義したら、Add Custom Functions()によって、現在実行されているJMPのインスタンスでその関数を追加および有効化できます。同様に、Remove Custom Functions()を用いて関数を削除したり、無効にすることもできます。
New Custom Function()は3つのパラメータ(namespace、functionName、functionDefinition)を必要とします。その他のメッセージにより、以下のものを定義できます。
• 計算式エディタにおける属性: 計算式のカテゴリ、結果の種類、パラメータ
• 変換における属性: 変換のカテゴリ
• 表示形式における属性: 表示形式のカテゴリ
• スクリプトの索引における属性: 説明、プロトタイプ、スクリプト索引のカテゴリ、例
ヒント: カスタム関数・カスタム変換・カスタム表示形式がデータテーブルで使われている場合で、それらがJMPセッションの中で定義されていない時は、列に「###」が表示されます。データテーブルの作成者は、あなたのパソコン上でそれらを定義するスクリプトを提供する必要があります。スクリプトを実行した後に、データテーブルをもう一度開いてください。
必要な指定をすべて含んだ関数(スクリプトの索引の情報とヒントのテキストを含む)を作成してみましょう。まず関数を定義した後、それを有効にします。
funcDef = Function( {x, y = 10}, x + y );
description = "この関数は2つの値を加算する。引数が1つだけ指定された場合、2番目の引数のデフォルトは10になる。";
// expr()の中の例には複数のステートメントを指定可能
ex2 = Expr(
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
myNameSpace:Add Ten( :age[4], 20 );
);
parmHint1 = "x value";
parmHint2 = "<y=10>";
/* 変数を用いて関数を定義
コマンドは、新規のカスタム関数の引数として受け入れることも可能 */
newAdd = New Custom Function( "myNamespace", "Add Ten", funcDef );
newAdd << Description( description );
newAdd << Prototype( "myNameSpace:Add Ten(x,<y=10>)" );
newAdd << Example( "myNameSpace:Add Ten(4)" );
// 例は、NameExpr()で渡す
newAdd << Example( Name Expr( ex2 ) );
newAdd << Parameter( "Number", parmHint1 );
newAdd << Parameter( "Number", parmHint2 );
newAdd << Formula Category( "数値の演算" );
// 「myNamespace:Add Ten」関数をシステムに追加
Add Custom Functions( newAdd );
上記の例を実行すると、JMPログに"関数の展開中: myNamespace:Add Ten"と出力されます。「説明」、「プロトタイプ」、「例」の結果を見るために、「スクリプトの索引」ウィンドウでこの関数を検索してみます。
図9.13 「スクリプトの索引」のカスタム関数
Formula Categoryメッセージは計算式エディタのカテゴリリストに新しいカテゴリを作成します。カスタム関数は、計算式エディタでは下線付きで表示されます。Parameterメッセージで指定したヒントのテキストも確認できます。
図9.14 計算式エディタのカスタム関数
カスタム関数を削除するには、Remove Custom Functions({"名前"})関数を使用します。
Remove Custom Functions( {"myNamespace:Add Ten"} );