データテーブル列へのメッセージを使うと、名前、データ、状態、メタデータなど、さまざまな列の属性や特性をすべて制御できます。これらのメッセージは対になっており、一方は各属性を設定(set)または割り当て、もう一方は各属性の現在の設定を取得(get)または問い合わせます。
たとえば、列の非表示、除外、ラベル、スクロールロック/ロック解除などをスクリプトで実行できます。値はブール値なので、1を入力するとその属性がオンになり、ゼロを送るとオフになります。
次の例では、「名前」列が「表示する」、「除外しない」、「ラベルあり」、「スクロールロック」の状態になります。
Column( "名前" ) << Hide( 0 );
Column( "名前" ) << Exclude( 0 );
Column( "名前" ) << Label( 1 );
Column( "名前" ) << Set Scroll Locked( 1 );
注: 各種の引数を設定するメッセージ(Set Name、Set Values、Set Formulaなど)はすべてSetで始まりますが、Setという語はSet Name 以外のメッセージでは省略可能です(Nameはすでに名前に特殊な文字を使うときのコマンドとして使われています)。好きな方の形式、または覚えやすい方の形式を使ってください。引数の現在の設定値を取得するメッセージ(Get Formulaなど)は、SetではなくGetで始まり、Getは省略できません。
列の選択を解除するには、データテーブルオブジェクトにClear Column Selectionメッセージを送ります。
dt << Clear Column Selection;
Set Nameを使って、列に名前をつけたり列の名前を変更したりできます。Get Nameは列の名前を戻します。次の例は、第2列(「年齢」)を「比率」に変更します。その後、現在の列名をログに戻します。
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
col = Column( 2 );
col << Set Name( "比率" );
col << Get Name;
"比率"
同様に、Set Valuesは列に値を設定します。変数が文字タイプの場合、引数はリストである必要があります。数値タイプの場合は行列(ベクトル)です。値の数がデータテーブルの現在の行数より多い場合は、必要な行が追加されます。Get Valuesは、値をリストまたは行列の形で戻します。Get As MatrixはGet Valuesに似ていますが、数値列の値を戻します。
col << Set Values( myMatrix ); // 数値変数の場合
col << Set Values( myList ); // 文字変数の場合
col << Get Values; // 行列を戻す。文字の場合はリストを戻します
col << Get Matrix(<列名のリスト>|<列番号のリスト>|<列範囲>; // 指定の列を行列として戻す
次の例は、値のリストと行列を戻します。
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Column( "名前" ) << Values( {Fred, Wilma, Fred, Ethel, Fred, Lamont} );
myList = :名前 << Get Values;
{"Fred", "Wilma", "Fred", "Ethel", "Fred", "Lamont", "JAMES", "ROBERT", "BARBARA", ...}
Column( "年齢" ) << Values( [28, 27, 51, 48, 60, 30] );
myVector = :年齢 << Get Values;
[28, 27, 51, ... ]
myMatrix = :Name("体重(ポンド)") << Get as Matrix;
[95, 123, 74, ... ]
注: 値ラベルの詳細については、『JMPの使用法』の値ラベルを参照してください。
値ラベルを使うと、簡略化されたデータの意味を説明するラベルを表示できます。たとえば、0と1の値を持つデータ列があり、0は男性、1は女性を表すとします。0の値ラベルを「男性」、1の値ラベルを「女性」とすると、わかりやすくなります。
値ラベルは、次の3つの方法のどれかで指定できます。「Big Class.jmp」サンプルデータテーブルでは、Mが男性、Fが女性を表しています。
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
:性別 << Value Labels( {"F", "M"}, {"女性", "男性"} ); // 2つのリストを使う
:性別 << Value Labels( {"F", "女性", "M", "男性"} ); // ペアのリストを使う
:性別 << Value Labels( {"F" = "女性", "M" = "男性"} ); // 割り当てのリストを使う
値のラベルを有効にするには、列にUse Value Labelsメッセージを送ります。
:性別 << Use Value Labels( 1 );
列の実際の値を表示するには、次のように指定します。
:性別 << Use Value Labels( 0 );
同じメッセージを使って、データテーブルのすべての列に対して値ラベルのオン/オフを切り替えることができます。
dt << Use Value Labels( 1 );
JSLを使って列のデータタイプを設定または取得することができます。設定できるタイプは、Character(文字)、Numeric(数値)、Row State(行の属性)です。次の例は、「Big Class.jmp」サンプルデータテーブルに文字タイプのデータを入れる新しい列を追加します。
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt << New Column( "新規" );
Column( "新規" ) << Data Type( Character );
Column( "新規" ) << Get Data Type;
"文字"
列の尺度を設定または取得するには:
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
col = New Column( "新規" );
col << Modeling Type( "Continuous" );
col << Get Modeling Type;
"連続量",
列のデータタイプを変更するときは、次のようにして列の形式を指定できます。
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
col = New Column( "日付" );
Column( "日付" ) << Data Type( Numeric, Format( "ddMonYYYY" ) );
Formatメッセージは、数値と日付/時間の形式を制御します。最初の引数は、列情報ウィンドウにある表示形式の選択肢を引用符で囲んだ文字列です。後続の引数は、表示形式によって異なります。フィールド幅も個別に設定できます。
col << Format( "Best", 5 ); // 幅が5
col << Format( "Fixed Dec", 9, 3 ); // 幅が9、小数点以下の桁数が3
col << Format( "PValue", 6 );
col << Format( "d/m/y", 10 );
col << Set Field Width( 30 );
日付の形式では、Formatメッセージにより日付をデータテーブルにどのように表示するかを指定します。データの入力形式や、入力または編集に備えて現在のセルを選択したときの表示形式を設定するには、Input Formatメッセージを使用します。
col << Format( "d/m/y", 10 ); // 日付を日-月-年の順序で表示する
col << Input Format( "m/d/y" ); // 日付を月-日-年の順序で入力する
日付時間の詳細については、日付時間の関数と形式を参照してください。
Formatメッセージと、指定された形式に従って数値を文字列に変換するFormat関数を混同しないでください(日付時間の関数と形式で説明しているように、通常、Format関数は日付/時間の表記に使われます)。オブジェクトにメッセージを送った場合は、同じ名前の関数を使った場合と結果がまったく異なります。 |
列の現在の形式を取得するには、次のようにGet Formatメッセージを実行します。
col << Get Format;
Format()関数とFormatメッセージでは、独自のスクリプトを使ってカスタムの表示形式を指定することができます。形式の名前は(「Best」や「Fixed」ではなく)「Custom」とし、引数とするスクリプトが、「value」という変数を使ってその値を表す文字列を戻します。正または負の整数を、ゼロを加えることで4桁以上の値として表示するには、次のようなスクリプトを作成します。
New Table( "Untitled",
New Column( "Column 1",
Numeric,
"Continuous",
Format(
"Custom", // カスタム形式にする
Formula( // JSL計算式を使用
Local( {sign, length = 4, result}, // ローカル変数
sign = If( value < 0, -1, 1 ); // 負の数を処理する
value = Char( Abs( value ) );
If( Length( value ) > length, // 大きすぎる値を処理する
value = Repeat( "#", length )
);
result = Right( value, length, "0" ); // ゼロを加える
If( sign < 0,
result = "-" || result // 再び符号を付ける
);
result; // 変更後の値を戻す
)
)
),
// サンプルデータで正、負、ゼロをテストする
Set Values( [0, 3, -5, 33, -55, 333, -555, 3333, -5555, 33333, -55555] )
)
);
カスタム形式の作成については、カスタム関数の作成、変換、フォーマットを参照してください。
有効桁数は最初のゼロでない数字と、それに続くすべての数字の桁で決まります。たとえば、3.14159の有効数字は6桁、0.00314は有効数字3桁になります。
以下は、[精度](Precision)表示形式を用いて、有効桁数を設定する例です。
Format( "Precision", 12, 3 ); // 幅12の3桁の有効数字
次の例は、計算式を設定、取得、および評価する方法を示しています。
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
col = New Column( "比率" ); // 列を作成し、その参照を格納する
col << Set Formula( :Name("身長(インチ)")/:Name("体重(ポンド)") ); // 計算式を設定する
col << Eval Formula; // 計算式を評価する
col << Get Formula; // 式 :height / :weightを戻す
列の値をスクリプトの中で使用する場合は、計算式を評価するコマンドを必ず加えてください。計算式の評価のタイミングは、JMPのバージョンによって異なる場合があります。
注:
• 計算式を追加すると、バックグラウンドで評価するようにスケジュールされます。スクリプト実行中の列の値に依存するような場合は、これが問題となる可能性があります。
• 1つの列を評価するときには、列にEval Formulaコマンドを送ることができます。これは、列を作成するコマンド内の計算式の節の直後で実行できます。
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt << New Column( "比率",
Numeric,
Formula( :Name("身長(インチ)") / :Name("体重(ポンド)") ),
Eval Formula
);
ここでのFormula()はSet Formula()の別名です。
ただし、計算式を追加する作業がすべて終わってから、次のようにRun Formulasコマンドを使って、正しい順序ですべての計算式を実行させるようにしてください。
dt << Run Formulas;
• Eval Formulaは計算式の評価をしますが、バックグラウンドでの再計算を行うため、Run Formulasコマンドの方がEval Formulaより適しています。システムのバックグラウンドで行われる計算タスクは、計算式が正しい順序で評価されるよう、十分な注意を払う必要があります。Run Formulasは、すべての計算処理が終了するまで、他のタスクを呼び出しません。
• 同一の値のセットを生成させるために乱数関数とRandom Reset(seed)の機能を使用している場合には、Run Formulasコマンドを使うと2回目の評価を行わずに済みます。
• 式の計算式がSupress Evalにより自動評価されないようになっている場合、それを無効にしてから、Eval Formulaを実行します。
• Add Custom Function()関数で、関数を作り、計算式エディタの関数リストに表示することができます。カスタム関数の作成、変換、フォーマットを参照してください。
JSLを使って、リストチェックおよび範囲チェックのプロパティを操作できます。次の例は、「Big Class.jmp」サンプルデータテーブルを使用します。
「性別」という列のリストチェックプロパティを設定し、クリアします。
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Column( "性別" ) << List Check( {"M", "F"} ); // プロパティを設定
Column( "性別" ) << List Check(); // プロパティをクリア
範囲チェックでは、表9.3の構文を使って範囲を指定する必要があります。
指定する範囲 |
使用する関数 |
---|---|
a £ x £b |
LELE(a, b) |
a £ x <b |
LELT(a,b) |
a < x £b |
LTLE(a,b) |
a < x < b |
LTLT(a,b) |
次の例は、「年齢」列の値が0より大きく、120未満でなければならないことを指定します。
Column( "年齢" ) << Range Check( LTLT( 0, 120 ) );
どの関数の前にもNotを置くことができます。また、上側または下側だけの範囲も指定できます。次の例は、「年齢」列の値が12以上でなければならないことを指定します。
Column( "年齢" ) << Range Check( not( LT( 12 ) ) );
範囲チェックの属性をクリアするには、次のように空のRange Check()を実行します。
Column( "年齢" ) << Range Check();
列に割り当てられているリストチェックまたは範囲チェックを取得するには、列にGet List CheckまたはGet Range Checkメッセージを送ります。
Column( "性別" ) << Get List Check;
Column( "年齢" ) << Get Range Check;
たとえば、「Big Class.jmp」の「年齢」列にGet Range Checkを送ると、次のような出力が表示されます。
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Column( "年齢" ) << Range Check( LTLT( 0, 120 ) );
Column( "年齢" ) << Get Range Check;
Range Check( LTLT( 0, 120 ) )
Set Property、Get Property、およびDelete Propertyを使って、リストチェックと範囲チェックを設定、取得、削除することもできます。列プロパティを参照してください。
注: 列の範囲チェックに関する処理をJSLで行う場合は、すべての警告が、インタラクティブなウィンドウではなくログウィンドウに表示されます。
Get Scriptは、列を作成するためのスクリプトを戻します。
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
New Column( "比率", Set Formula( :Name("身長(インチ)")/ :Name("体重(ポンド)")) );
Column( "比率" ) << Get Script;
New Column("比率",
Numeric,
"Continuous",
Format( "Best", 10 ),
Formula( :Name("身長(インチ)") / :Name("体重(ポンド)") )
);
列の役割をあらかじめ選択するには、Preselect Roleメッセージを使用します。選択できる役割は、No Role、X、Y、Weight、およびFreqです。Get Roleメッセージは、現在の設定を戻します。
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
col = New Column( "新規" );
col << Preselect Role( X );
col << Get Role;
列をロックまたはロック解除するには、ブール引数を指定してLockまたはSet Lockを使います。Get Lockは現在の設定を戻します。
col << Lock( 1 ); // ロック
col << Set Lock( 0 ); // ロック解除
col << Get Lock; // 現在の状態を表示