LabTalkにおける範囲表記
Tutorial-Range-Notation
概要
Originプロジェクト内では、主にワークブック、グラフ、行列、ルースデータセットの4つの場所にデータが存在します。
Range変数を使うと、それらのオブジェクト内のデータにアクセスできます。range変数を宣言すると、rangeの読み込みまたは書き込みが可能です。
|
Orgin 2023から、ページ名(ワークブック、行列、グラフなど)の範囲参照では、ページのロングネームはダブルクォートし、ページのショートネームはダブルクォートしないでください(これまではロングネームのダブルクォートが必須で、ショートネームのダブルクォートは可能でしたが、推奨されません)。ショートネームのダブルクォートの禁止は、置換による参照(例:[%H] が正しい、 ["%H"]にはしないでください)にも適用されます。この変更により、ページのロングネームの検索では、アクティブなフォルダのウィンドウのロングネームを優先的に検索するようになります。この禁止事項により、フォルダの複製やプロジェクトの追加を行う際、より強固なページ参照が可能になります。ただし、以前の挙動にしたい場合は、システム変数@RQSを使ってこの変更をもとに戻すことができます。
|
宣言
range変数は他のデータタイプと同様の構文で宣言できます。
range [-option] RangeName = RangeString
- 範囲指定の左辺は、すべてのタイプの範囲指定で統一されています。範囲名はOrigin変数の命名規則に従います。[-option]コンポーネントはオプションのパラメーターを示し、使用可能なオプションスイッチはデータ型によって異なります(詳細は、範囲データの型を参照してください)。
- 範囲割り当ての右側であるRangeStringは、オブジェクトの種類によって異なります。詳細については、次のサブトピックを参照してください。
ワークブック
ワークブックデータに対して、RangeString は次の形式を取ります。
[WorkBookName]SheetNameOrIndex!ColumnNameOrIndex[CellIndex]
- ショートネームがデフォルトのプログラミング名であるため、上記のWorkBookName とSheetName は対応するショートネームを参照します。
- ワークブックやワークシートの範囲表記でロングネームを使用するには、["MyBook"]"MySheet"]のようにロングネームをダブルクォーテーションで囲む必要があります!
- 逆に、ショートネームをダブルクォーテーションで囲まないでください(これには[%H]のような参照も含みます)。Origin 2023より前では、この方法は推奨されてはいませんでしたが、使えていた可能性があります。Origin2023以降、ショートネームをダブルクォートすると失敗する可能性が高くなりました。以前の挙動(ショートネームをダブルクォートすることを許可する)に戻したい場合は、LabTalkシステム変数@RQSをご覧ください。
- ショートネームのダブルクオートを禁止する変更に伴い、ページロングネームの検索では、ウィンドウロングネームをアクティブフォルダから優先的に検索するようになりました。これは下記のようなことを可能にします。
-
- フォルダを複製し、ワークブックで定義されたローカル変数に依存するようなフォルダ内の操作を保持します。
- プロジェクトエクスプローラのフォルダをプロジェクトとして保存し、後でそのプロジェクトを別のプロジェクトに追加することができます。その際、ウィンドウのショートネームは名前の衝突を避けるために変更されますが、ウィンドウのロングネームに依存する操作には影響がありません。
- ColumnName (引用符なし) には、列のロングネームまたはショートネームのいずれかを指定します。 (ロングネームにスペースがある場合は、二重引用符で囲む必要があります)
- 2022bから、@LNCS=1で列ロングネームは大文字小文字を区別するようになりました。
ワークシートセル範囲
rangeを使用して単一セルまたはセルブロックにアクセスします。範囲は行および列をまたがる場合があります。
// cell(2,1)、列1の行2
range aa = 1[2];
// cell(1,1) から cell(10,3)
range bb = 1[1]:3[10];
Note:セルブロックを表す範囲変数は、Xファンクションの引数としてのみ使用でき、直接計算はサポートされていません。
サンプル 1
//列A、Bのあるワークブックを作成
newbook;
//第一列に値を入力
col(A) = {1:10};
// 列Aのデータセットをrange aa、列B(空)のデータセットをrange bbとして定義
range aa = col(A);
range bb = col(B);
// range aaセル1の値をrange bbセル1にコピー
bb[1] = aa[1];
サンプル 2
//新規ワークブックを作成
newbook;
//最初の列に値を入力
col(A) = {1:10};
// アクティブシートの名前を文字列変数"yy$"に置く
yy$ = %H;
// 値の列を範囲変数"aa"に定義
range aa = [yy$]1!col(A);
// 新規ワークブックを作成して"zz$"に名前を置く
newbook;
zz$ = %H;
// 新規ブック内の範囲を定義
range bb = [zz$]1!col(A);
// "aa」セル1の値を"bb」セル1に書き出し
bb[1] = aa[1];
列ラベル行範囲
range変数を使ってアクティブワークブックの列ラベル行にアクセスします。
range rr=[L:C];
range rr=1[L]:end[L];
ラベル行の場合、range変数内で(-1)のような負の値は使用できないことに注意してください。
サンプル
// 新規ワークブックを作成
newbook;
// ファイルをインポート
string fn$=system.path.program$ + "Samples\Import and Export\ASCII Simple.dat";
impASC fname:=fn$;
// 生データを含む範囲変数を定義
range raw = [%H]1!col(signal);
// 第1および第2ユーザ定義パラメータ行を表示
wks.userParam1 = 1;
wks.userParam2 = 1;
// 第一パラメータ行を"Mean」第二パラメータ行を"Std.Dev."に名前変更
wks.UserParam1$ = "Mean";
wks.UserParam2$ = "Std.Dev.";
// mean()およびstddev()関数を使用して、値を小数点以下 5 桁まで返す
// 範囲変数 raw のそれぞれのラベル行セルへ
raw[Mean]$ = $(mean(raw),*5);
raw[Std.Dev.]$ = $(stddev(raw),*5);
列ラベル行データへのアクセスについての詳細とサンプルは以下を参照してください。
ワークシート列の部分範囲
// ブック1シート2列Aの3-10行の部分範囲
range cc = [book1]sheet2!col(a)[3:10];
//アクティブワークシートの第一列を参照するrange
range r1 = !1;
//部分範囲を指定する場合変数を使用可能
int istart=3;
int iend=10;
range r2 = r1[istart:iend];
サンプル
//新規ワークブックを作成
newbook;
//第一列に値を入力
col(A) = {1:10};
//この第一列を参照するrangeを作成
range rA = col(A);
//新規シートを追加
newsheet;
//最初のワークシートの最初の列の値をこの列に入力
col(A) = rA;
range rAA = col(A);
newsheet;
range r1 = rA[1:5];
range r2 = rAA[6:10];
col(A) = r1 + r2;
ワークシート列範囲
データ列全体にアクセスするには、範囲変数を使用します。
以下の例では、定義されているすべての範囲が、アクティブなワークシートの最初の列を参照しています (最初の列の名前が「A」と仮定)。col( )およびwcol( )関数は、Originの「列値の設定」ダイアログで使用されているものです。
range rA = A;
range rAA = col(A);
range r1 = 1;
range ricol = wcol(ncol);
int ncol = 1;
range rr = $(ncol);
サンプル
範囲変数が作成されると、範囲のデータを直接操作することができるようになり、範囲への読み書きができるようになります。
//新規ワークブックを作成
newbook;
//第一列に値を入力
col(A) = {1:10};
//第二列に値を入力
col(B) = {2:2:20};
//第一列を参照する範囲を作成
range rA = col(A);
//第二列を参照する範囲を作成
range rB = col(B);
//新規シートを追加
newsheet;
//列範囲の値に2をかけてA列に割り当て
col(A) = rA *2;
//列範囲の値を2で割ってB列に割り当て
col(B) = rB/2;
特定のXファンクションで使用する場合、ワークシート内の複数の列またはセルのブロックの範囲を定義することができます。
range raMC = col(2):col(4); // または 2:4
stats raMC;
ty %(raMC) values range from $(stats.min) to $(stats.max);
range raBlock = 2[5]:10[300]; // 列2行5から列10行300
stats raBlock;
ty %(raBlock) values range from $(stats.min) to $(stats.max);
Origin 2022bでは、@LNCS=1のときに列ロングネームは大文字小文字を区別します。
col("M")=10*col("m"); // "M" および "m"は別の列のロングネーム
ワークシート範囲
ワークブックにアクセスするには、範囲変数を使用します。
range rSheet1 = [Book1]Sheet1!;
range rSheet2 = 1!;
range rSheet3 = !;
Note: アクティブなブックウィンドウBook1でSheet1がアクティブなときに上記のすべてのコマンド行を実行すると、3 つの範囲変数はすべて同じワークシートを参照します。
サンプル
//新規ワークシートを作成
newsheet;
//アクティブワークシートを参照する範囲
range rWks = !;
ワークブックページ範囲
ワークブック全体にアクセスするには、範囲変数を使用します。以下のサンプルでは、ワークブックBook1をアクティブにして実行した場合、3つの範囲変数全てがBook1ウィンドウを参照します。
range rPage1 = [Book1];
//%H はアクティブウィンドウの名前を保持するシステム文字列レジスタ
range rPage2 = [%H];
string strBookName$ = %H;
range rPage3 = [%(strBookName$)];
グラフ
グラフデータでは、RangeStringは以下の形式を取ります。
[GraphWindowName]LayerNameOrIndex!DataPlot
割り当ての例はこのようになります。
range ll = [Graph1]Layer1!2; // Graph1のLayer1にある2つ目の曲線
グラフデータ部分範囲
サンプル
//インデックス10 - 20のアクティブプロットを積分
integ1 1[10:20];
グラフデータ範囲
range rAA = [Graph1]Layer1!1;
range rBB = 1!1;
range rCC = !1;
range rDD = 1;
Note: Graph1ウィンドウのレイヤ1がアクティブな場合上述の3行を実行すると、3つの範囲変数全てがレイヤ内の第一データプロットを参照します。
サンプル
range rr = 1;
set rr -c color(green);
グラフレイヤ範囲
グラフウィンドウ内のレイヤにアクセスするには、範囲変数を使用します。
range rAA = [Graph1]Layer1!;
range rBB = 1!;
range rCC = !;
Note: Graph1ウィンドウのレイヤ1がアクティブな場合上述の3行を実行すると、3つの範囲変数全てがそのレイヤを参照します。
サンプル
//レイヤはOriginのオブジェクトです。 詳細はOriginオブジェクトのチュートリアルを参照してください。
//アクティブレイヤを参照するグラフレイヤオブジェクト
range rr= !;
//グラフレイヤオブジェクトの幅と高さを調整
rr.width=50;
rr.height=50;
グラフページ範囲
グラフウィンドウ全体にアクセスするには、範囲変数を使用します。以下のサンプルでは、Graph1をアクティブにして実行した場合、3つの範囲変数全てがこのウィンドウを参照します。
range rPage1 = [Graph1];
//%Hはアクティブウィンドウの名前を保持するシステム文字列レジスタ
range rPage2 = [%H];
string strGraphName$ = %H;
range rPage3 = [%(strGraphName$)];
行列
行列データでは、RangeStringは以下の形式を取ります。
[MatrixBookName]MatrixSheetNameOrIndex!MatrixObject
Note: ショートネームがデフォルトのプログラミング名であるため、上記のWorkBookName とSheetName は対応するショートネームを使用しました。行列ブックと行列シートで範囲変数にロングネームを使用するには、["MyMatrixBook"]"MyMatrixSheet"!のように、ロングネーム を二重引用符で囲みます。 |
行列データ部分範囲
セルまたはセル範囲を指す範囲を宣言できます。行列は2D配列ですが、この場合のインデックスは、1から行列内のセル数までの1次元のインデックスです。番号付けは行の主要な順序で、ここでのインデックスの計算は次のとおりです。
index = (RowNumber - 1) * NumberOfColumns + ColumnNumber
たとえば、デフォルトの32x32の行列の場合、10番目の行および20番目の列のセルは以下ようなインデックスになります。
(10 - 1) * 32 + 20 = 308
range raMC = [MBook1]1!1[308];
raMC -= 100;
行列データ
行列データは、行列オブジェクトと呼ばれ、 wks.colオブジェクトと同等です。
range raMD = [MBook1]"First Object Collection"!1;
stats raMD;
ty %(raMD) ranges from $(stats.min) to $(stats.max);
行列データ範囲を指定すると、行と列でセルにアクセスできます。
raMD[10,20] += 100; // 行10、列20のセルを100ずつ増やす
行列シート
wksオブジェクトと同等の行列シートプロパティにアクセスできます。
range raMS = [MBook1]MSheet1;
raMS.Name$ = First Object Collection;
行列ブック
行列ブック範囲を使用して行列ページのプロパティにアクセスできます。
range raMB = [MBook1];
raMB.Label$ = Final Results;
非接続データセット
非接続データセット(ルースデータセット)は、ワークシートの列に似ていますが、ブック・シート・列構成を持ちません。非接続データセットは、通常、 create コマンド で作成されるか、Dataset 宣言せずに代入文で自動的に作成されます。
非接続データセットでは、RangeStringは以下の形式を取ります。
[??]!LooseDatasetName
割り当ては、構文を使って行うことができます。
range xx = [??]!tmpdata_a; // 非接続データセット 'tmpdata_a'
サンプル
ここでは、非接続データセットを作成し、Xファンクションplotxyを使用してグラフをプロットします。
// 2つの非接続データセットを作成
create tmpdata -wd 50 a b;
tmpdata_a=data(50,1,-1);
tmpdata_b=normal(50);
// 範囲を宣言
range aa=[??]!(tmpdata_a, tmpdata_b);
// 散布図を作成
plotxy aa;
|
非接続データセットはプロジェクトに属するので、宣言され、セッションまたはローカルスコープを持つDataset変数とは異なります。データセット変数も内部的には非接続データセットですが、計算のみに使用するよう制限されており、例えばプロット作成には使用できません。
|
範囲について詳細情報
LabTalk 範囲構文の詳細については、LabTalkスクリプトガイドの「範囲表記」を参照してください。
|