いくつかの数値データをロードしたり、作成したら、ここに示すような操作を行うことができます。
ほとんどのデータは列に保存されており、そのデータに対して行毎にさまざまな操作を実行することができます。 LabTalkスクリプトで2つの方法でこれを行うことができます。(1) 演算子を使って直接ステートメントまたは (2) 範囲を使う、という選択肢があります。 例えば、列Aの各行に値を追加し、列Bにはそれに対応する値を追加し、列Cに結果の値を配置します。
Col(C) = Col(A) + Col(B); // 加算 Col(D) = Col(A) * Col(B); // 乗算 Col(E) = Col(A) / Col(B); // 除算
「 - 」と「 ^ 」の演算子は、それぞれ減算と指数として上記のように動作します。
範囲変数を使えば、異なるシートにある列に対して同じ操作を行うことができます。
// sheet1, 2, 3の列1をポイント range aa = 1!col(1); range bb = 2!col(1); range cc = 3!col(1); cc = aa+bb; cc = aa^bb; cc = aa/bb;
異なるシートにあるデータを算術演算するときには、範囲変数を使う必要があります。 範囲文字列への直接参照はサポートされていません。 例えば、スクリプト Sheet3!col(1) = Sheet1!col(1) + Sheet2!col(1); は動作しません。 |
標準的な演算子に加え、LabTalkは、sin や cos のような三角関数、 Bessel関数、uniform や Poissonのような統計分布データを生成する関数など、データを操作する多くの一般的な関数をサポートしています。 すべてのLabTalk関数は、1つの引数で動作しますが、多くはその中でベクター化され、ワークシート列、ルーズデータセット、行列で動作します。 例えば、三角関数 sin は次のようになります。
// 数値のsinを見つける: double xx = sin(0.3572)
// 列データのsinを見つける (行毎) Col(B) = sin(Col(A))
// 行列データのsinを見つける (要素毎) [MBook2] = sin([MBook1])
関数の例として、主要な機能がデータ生成であるuniform 関数を考えます。この形式では、作成する値の数として入力Nを取り、そして、0から1までの範囲で均一に分布した乱数を N 個生成します。
/* 列Bの最初の20行に一様に分布した乱数を入力: */ Col(B) = uniform(20);
LabTalkでサポートする関数の完全なリストについては、アルファベット順の関数リストをご覧下さい。
Originのメニュー操作で、列値の設定ダイアログを使って、指定した数式でワークシート列にデータを生成または変換することができます。このような変換は、 csetvalue Xファンクションを使ってLabTalkで実行することもできます。ここにLabTalkを使って列値をセットする方法を示すサンプルがいくつかあります。
newbook; wks.ncols = 3; // 列1に乱数を入力 csetvalue formula:="rnd()" col:=1; // 列1のデータを 0 ~ 100の整数値に変換 csetvalue formula:="int(col(1)*100)" col:=2; // 列値を設定するときに実行前の処理スクリプトを指定 // 再計算モードを手動にセット csetvalue formula:="mm - col(2)" col:=3 script:="int mm = max(col(2))" recalculate:=2; string str$ = [%h]%(page.active$)!; newsheet cols:=1; // range変数を使って別のシートの列を参照 csetvalue f:="r1/r2" c:=1 s:="range r1=%(str$)2; range r2=%(str$)3;" r:=1;
列の式をセットするのに論理宣言が使用されているとき、0.0, NANUM(欠損値)や-1.0E-290 から 1.0E-290の値などは、Falseとして評価されます。つまり、LabTalkはコマンドは、1(真)の代わりに0(偽)を返します。 type $(-1e-290?1:0); // 0 (偽)を返す type $(1/0?1:0); // 0 (偽)を返す, ここで 1/0 == NANUM |
colcopy Xファンクションは、列ラベル行と日付や文字と数値のような列フォーマットを含むデータ列をコピーします。
次の例は、アクティブワークシートの2列目から4列目をbook2のsheet1の1列目から3列目にコピーします。
// 列のロングネーム、単位とコメントだけでなく // データと書式の両方をコピー colcopy irng:=(2:4) orng:=[book2]sheet1!(1:3) data:=1 format:=1 lname:=1 units:=1 comments:=1;
特定の列をソートするには、Xファンクション wsort が使用できます。このXファンクションを使って1列のみをソートするには、引数C1とC2は、ワークシートの同じ列でなければならず、bycolもC1と同じである必要があります。
// 新しいワークブックを作成 newbook; // 第1列は行番号、2列目は一様乱数で埋める col(1) = {1:32}; col(2) = uniform(32); // 2列目を降順にソートする wsort c1:=2 c2:=2 bycol:=2 descending:=1;
Xファンクションcolreverseを使用して列を逆順にします。
// 新しいワークブックを作成 newbook; // 第1列は行番号、2列目は一様乱数で埋める col(1) = {1:32}; col(2) = uniform(32); // 1列目をインデックスを使用して逆順にする colreverse rng:=1; // colreverse rng:=col(A); // このスクリプトも使用可能 // 2列目をrange変数を使用して逆順にする range rr = 2; colreverse rng:=rr;