範囲表記

目次

範囲のイントロダクション

Originプロジェクトの内部では、データはワークシートの列、行列、非接続データセット、グラフの4つの主要な場所に存在します。 これらの形式のいずれも、範囲データ型を使って、簡単に標準的な方法でデータにアクセスすることができます。

範囲変数を作成すると、範囲データを直接操作することができ、範囲を読み書きできます。以下のサンプルは、範囲変数の作成と多くのデータ型の使用方法を示すものです。

Origin Version 8.0以前では、データは cell(), col() , wcol() 関数だけでなく、データセットを使ってアクセスしていました。現在でも cell(), col(), wcol() 関数は、アクティブブックのアクティブシートを操作する場合に、データアクセスするのに効果的です。 範囲表記は、本質的には、これらの関数を拡張して、Originプロジェクト内のどのブック、シート、プロットでもアクセスできるようにするものです。

Note : すべてのXファンクションが複数列や非隣接列などの複雑な範囲を扱える訳ではありません。詳細はヘルプファイルをご確認ください。

Note : グラフ内のデータはデータプロットの形式で、それらは本質的には列、行列、非接続データセットへの参照となります。グラフには実際のデータは保存されません。

宣言とシンタックス

他のデータタイプと同様、次のシンタックスを使って範囲(Range)変数を宣言できます。

range [-option] RangeName = RangeString

範囲割り当ての左側は、範囲割り当てのすべての形式に対して同じ形です。 大括弧([])はオプションスイッチはオプション設定できるパラメータで、データタイプによって利用可能なオプションスイッチは異なります。詳細は下の範囲のデータ型セクションをご覧ください。 範囲名は、 Originの変数名の規則に従います。システム変数名は使用しないでください。

範囲割り当ての右側、RangeStringは、範囲が示すオブジェクトの種類により変わります。 個々の範囲文字列は、下記のセクションの範囲のデータ型で説明されています。

範囲表記は、範囲変数を定義するために、排他的に使われます。シンタックスの代入文のどちらか一方では、データアクセスのための一般表記として使うことはできません。

Originオブジェクトにアクセスする

範囲変数は、Originオブジェクトの次の種類に割り当てられます。

一度割り当てると、範囲はそのオブジェクトを表すので、範囲変数を使って、そのオブジェクトのプロパティとメソッドにアクセスできます。

range rA = [Book1]Sheet1!Col(A);
rA.name$=;
rA.lname$=;
rA.unit$=;
rA.index=;
rA.nRows=;

アクセス可能なオブジェクトのプロパティとメソッドを確認するには、スクリプトウィンドウを開いて次のように入力します。

rangeVariable.=;

ここで、rangeVariableは範囲変数の名前です。


範囲は、標準的なOriginオブジェクトのいくつかのサブセットまたは組合せで構成されます。 サンプルには以下が含まれます。

範囲のデータ型

ワークシートデータ

ワークシートデータに対して、RangeString は次の形式を取ります。

[WorkBookName]SheetNameOrIndex!ColumnNameOrIndex[CellIndex]

Note: ショートネームがデフォルトのプログラミング名であるため、上記のWorkBookNameSheetName は対応するショートネームを参照します。ワークブックまたはワークシートの範囲表記でロングネーム を使用するには、ロングネーム を["MyBook"]"MySheet"!; のように二重引用符で囲む必要があります。一方、ColumnName(引用符なし)は列のロングネーム またはショートネーム のいずれかです。

どのRangeStringでも、シート、列、行の一組のインデックスを、それぞれindex1:index2のようにコロンで分けて、シート、列、行の連続した区間の開始と終了を指定することができます。 キーワード end index2 に使うと、指定したオブジェクトのすべてを範囲とすることを示しています。 例えば、

range rs = [Book1]4:end!           // シート4から最後まで取得
range rd = [Book2]Sheet3!5:10;     // 列5から 10まで取得
range rr = ["MyBook"]Sheet1!A; // ワークブックのロングネームでシート1の列Aを取得
                               // ブック名MyBook

行の場合、インデックスは角括弧で囲む必要があり、ワークシート列のいくつかの行に対する全範囲割り当てのステートメントは、次のようになります。

range rc1 = [Book1]Sheet2!Col(3)[10:end];   // 10行目から最後まで
range rc2 = [Book1]Sheet2!Col(3)[10:20];    // 10行目から20行目まで

Cell 関数 はセルの内容にアクセスする古い方法ですが、現在でもサポートされています。

範囲を使って、列ラベル行にアクセスする方法については、メタデータにアクセスする および 列ラベル行リファレンステーブルをご覧下さい。

アクティブワークシートの列に対する範囲変数を宣言するとき、ブックとシートの部分を次のように省略することができます。

range rc = Col(3)

さらに、実際の列を識別でき、次のように単純な表記にすることができます。

range aa=1;        // アクティブワークシートのcol(1)
range bb=B;        // アクティブワークシートのcol(B)
range cc="Test A"; // アクティブワークシートのロングネーム("Test A")の列

aa = 1! などの式で、アクティブブックの最初のシートを参照します。aa = "1!"では、ロングネームが1!の現在のシートの列を参照します。範囲宣言の引用符の保持または破棄を制御するには、システム変数@RPQを参照してください。

複数の範囲変数をカンマで分けて、同じ行で宣言できます。 上記の例は、次のように書くことができます。

range aa = 1, bb = B, cc = "Test A";

異なるブックのシートや同じシートのすべてを参照する必要がある場合、ブックのシート部分を次のように組み合わせることができます。

range ["MyBook"]Sheet3 aa=1, bb=B, cc="Test A"; //ブックロングネームはMyBook

Originの列のロングネームは固有にする必要はない(例: 同じワークシートの複数列に同じロングネームを使うことが可能)ので、ショートネームとロングネームを一緒に指定するとより正確になります。

range dd = D"Test 4";  // Col(D)(ロングネームTest 4)を範囲に割り当て

列の範囲を割り当てたら、それを使って列のパラメータにアクセスしたり、変更することができます。

range rColumn = [Book1]1!2;       // 範囲は列
rColumn.digitMode = 1;            // 表示のための小数点桁数を使用

rColumn.digits = 2;               // 2桁を使用

または、計算を実行します。

// それぞれアクティブワークブックのシート1, 2, 3の列に割り当てる
range aa = 1!col(1);
range bb = 2!col(1);
range cc = 3!col(1);
cc = aa+bb;

異なるシートにあるデータを算術演算するときには、範囲変数を使う必要があります。 範囲文字列への直接参照はまだサポートされていません。 例えば、スクリプト Sheet3!col(1) = Sheet1!col(1) + Sheet2!col(1); は動作しません。範囲変数を宣言せずに1行で書く必要がある場合、別の方法としてデータセット置換を使ってください。

ページとシート

1列のデータだけでなく、範囲はページオブジェクトのどの部分にでもアクセスするのに使うことができます。

範囲変数を使って、ワークブック全体にアクセスします。

// 'rPage' はBook1というワークブックを示す
range rPage = [Book1]; 
 
//  'Book1'のロングネームを"My Analysis Worksheets"にセット
rPage.LongName$ = My Analysis Worksheets;

範囲変数を使ってワークシートにアクセスします。

range rSheet = ["MyBook"]"MySheet"!;      // 範囲は、ブックロングネームMyBook、 
                                          //シートロングネームMySheetを持つワークシート(WKSオブジェクト)
rSheet.name$ = "Statistics";        // Sheet1を"Statistics"に
page.xlcolname = 0;               //最初にスプレッドシートのセル表記をオフに
rSheet.AddCol(StdDev);              // StdDevという名前の列を追加

ワークブックのスプレッドシートセル表記については、FAQ-849 を参照してください。

列の部分範囲

範囲変数を使って、次のように列の部分範囲を指定することができます。

//MyBook(ロングネーム)、sheet2のcol(a)の部分範囲
range cc = ["MyBook"]sheet2!col(a)[3:10];

または、目的のワークブックとワークシートがアクティブな場合、短い表記を使うことができます。

// book1、sheet2のcol(a)の部分範囲

range cc = col(a)[3:10];

この範囲変数を使うと、計算または他の操作を列の一部分だけで行う事ができます。例えば、

range r1=1[5:10];
range r2=2[1:6];
r1 = r2; // 列2の1行目から6行目までの値を列1の5から10行目までに移動
r1[1]=; 
// これで1行2列目と同じ値を5行1列目に出力

セルブロック

次のように範囲を使って1つのセルまたはセルブロック(複数の列と行をまたがるセル)にアクセスできます。

range aa = 1[2];                       // cell(2,1), 列1の2行目
range bb = 1[1]:3[10];                 // cell(1,1) から cell(10,3)

Note: セルブロックを表す範囲変数は、Xファンクションの引数としてのみ利用でき、直接計算することはできません。

Originのjoin()関数で、複数の非連続範囲を1つのデータセットに結合できます。

オプションスイッチ -v

必要Originバージョン:9.1SR0

ワークシートデータでは-vスイッチで1つのブロックを範囲として定義してその値を一時ベクトルとして保存することができます。これにより、同様の大きさを有市ながらもブロックの形が異なるブロック間のデータ移行が行えます(つまり、行から列への値の割り振りが可能になります)。

次の例では、ワークシートの特定の列の行にあるすべてのエントリをスケーリングします。

// 最後の列を除くすべての列の最初の要素を係数でスケーリング
range -v r=1[1]:$(wks.ncols-1)[1];
r*=10;
// すべての列の最初の要素をスケーリング
range -v r=1[1]:end[1];
r*=10;

次はこのオプションスイッチの使用方法の一例を示します。

//ワークブック内にサンプルデータをインポートする
fname$=system.path.program$ + "\Samples\Statistics\automobile.dat"; 
newbook;
impasc;
//ブロックを列BとCのすべての列と定義
range -v r1 = B[1]:C[end];
// Create a new sheet
newsheet;
//ブロックを大きさの決まった列AとBを定義
range -v r2 = 1[1]:2[r1.GetSize()/2]; // ブロックの大きさは2列×行数
//最初のブロックの値を2つ目のブロックに定義する
r2 = r1;

ベクターはデータを列の順番で保存し、”形”にかかわらず移動先のブロックへ移動します。

// 新しいブックにサンプルデータをインポート
fname$=system.path.program$ + "\Samples\Statistics\abrasion_raw.dat"; 
newbook;
impasc;
// 1つのブロックを列Aと列Bのすべての行で定義
range -v ra1 = 1[1]:2[end];
// 新しいシートを作成
newsheet;
// ブロックを1列で定義、ra1 ブロックを大きさとする
range -v ra2 = 1[1:ra1.GetSize()];
// 1番目のブロックの値を2番目のブロックに割り振る
ra2 = ra1;
col(1)[L]$ = Combined;

Note: 目的のブロックで定義される列は割り振られる前に存在する必要があります。

行列データ

行列データに対してRangeString は、

[MatrixBookName]MatrixSheetNameOrIndex!MatrixObject

Note: ショートネームがデフォルトのプログラミング名であるため、上記のWorkBookNameSheetName は対応するショートネームを使用しました。行列ブックと行列シートで範囲変数にロングネームを使用するには、["MyMatrixBook"]"MyMatrixSheet"!のように、ロングネーム を二重引用符で囲みます。

次のような代入文を作成します。

// MBook1, MSheet1の2番目のオブジェクト
range mm = [MBook1]MSheet1!2;
// 行列ブックMatBook1(ロングネーム)の行列シートMatSheet1(ロングネーム)の
// ロングネームMatObject1の行列オブジェクト
range mo = ["MatBook1"]"MatSheet1"!Mat("MatObject1");

RangeName[row, col]の表記を使って行列範囲のセルの内容にアクセスします。 例えば、

range mm=[MBook1]1!1;    
mm[2,3]=10;

行列に複素数が含まれる場合、複素数を表す文字列は次のようにアクセスできます。

string str$;
str$ = mm[3,4]$;

グラフデータ

グラフデータに対してRangeString は、

[GraphWindowName]LayerNameOrIndex!DataPlot

サンプルの代入文は次のようなものです。

range ll = [Graph1]Layer1!2;       // Graph1, Layer1の2番目の曲線

-w、-wx、-wy-wzのオプションスイッチ

グラフウィンドウに対して、range -w、range -wx、range -wy、range -wzオプションを使って、プロットしたデータセットのワークシート列範囲を取得できます。

range -w は常にワークシートの従属変数(2DプロットではY値、3DプロットではZ値)を取得しますOrigin9.0SR0以降では、 range -wにより複数の範囲がサポートされました。

range -wx、range -wy、range -wzはそれぞれ対応するワークシートのX、Y、Z値を取得します。

range -wx, range -wz 必要なOriginのバージョン: 9.0 SR0

// グラフウィンドウをアクティブウィンドウにする
// 最初のデータプロットのY値のワークシート範囲を取得 
range -w rW = 1;
 
// 対応するX値のワークシート範囲を取得 
range -wx rWx = 1;
 
// 対応するY値のワークシート範囲を取得
range -wy rWy = 1;
 
// 対応するZ値のワークシート範囲を取得
range -wz rWz = 1;
 
// 最初のデータプロットのグラフ範囲を取得
range rG = 1;      
 
// 現在の選択を取得(%C); マーカー間のデータが決定する
range -w rC = %C;

上記のスクリプトで、rW = [Book1]Sheet1!B ですが、rG = [Graph1]1!1であることに注意して下さい。

グラフのデータセレクタの範囲

データセレクタツールを使って、グラフの1つ以上の範囲を選択し、LabTalkから参照することができます。選択した範囲が1つでは、システム変数MKS1, MKS2を使うことができます。v8.0 SR6以降では、新しいXファンクション get_plot_sel が追加され、解析するために選択範囲を文字列に取得できます。 次のサンプルは、現在のグラフの各範囲を選択する方法を示しています。

string strRange;
get_plot_sel str:=strRange;
StringArray sa;
sa.Append(strRange$,"|"); //トークン化する
int nNumRanges = sa.GetSize();
if(nNumRanges == 0)
{
	type "there is nothing selected";
	return;
}
type "Total of $(nNumRanges) ranges selected for %C";
for(int ii = 1; ii <= nNumRanges; ii++)
{
	range -w xy = sa.GetAt(ii)$;
	string strWks$ = "Temp$(ii)";
	create %(strWks$) -wdn 10 aa bb;
	range fitxy = [??]!(%(strWks$)_aa, %(strWks$)_bb);
	fitlr iy:=xy oy:=fitxy;
	plotxy fitxy p:=200 o:=<active> c:=color(red) rescale:=0 legend:=0;
	type "%(xy) fit linear gives slope=$(fitlr.b)";
}
// 完了したらすべてのデータマーカーを消去
mark -r;

次の文書も参考にして下さい。 Create (コマンド)(非接続データセットの作成), [??] 範囲表記 (非接続データセットから範囲を作成), fitlr Xファンクション, StringArray (オブジェクト) (特に、Append メソッドは、Origin 8.0 SR6で新しく加わったものです。)

X値を使用した部分範囲指定

XY範囲で作業する場合、X値を使用して部分範囲を指定できます。シンタックスは次のようになります。

  1. ワークシートから
    [WorkBookName]SheetNameOrIndex!YColumnNameOrIndex[xX1:X2]

例:

// XとYに列1と2を使用してX=0.15~0.2の部分範囲を指定
range rxy = (1, 2)[x0.15:0.2];
  1. グラフから
    [GraphWindowName]LayerNameOrIndex!DataPlot[xX1:X2]

例:

// Graph1, Layer1の2番目の曲線のXY部分範囲
range rxy2 = [Graph1]Layer1!2[x5:20];

次の例では、Xファンクション plotxyを使用してグラフをプロットし、Xファンクション smoothを使用してデータの部分範囲をスムージングします。

// 新規ブックにデータをインポート
newbook;
fname$ = system.path.program$ + "\Samples\Signal Processing\EMG Recording.dat";
impasc;

// XY部分範囲X=5~5.5および9.3~9.8を定義
range rxy1 = (1, 2)[x5:5.5];
range rxy2 = 2[x9.3:9.8];
plotxy rxy1 plot:=200;  // 1番目のXY部分範囲の線図
smooth -r 2 rxy2 method:=le;  // 2番目のXY部分範囲をLoessでスムージング

X値に基づいて部分範囲を指定する場合、Xデータは単調である必要があります。

非接続データセット

非接続データセットは、ワークシートの列に似ていますが、ブック-シート-列の構成のオーバーヘッドがありません。これは、通常、 create コマンド で作成されるか、Dataset 宣言せずに代入文で自動的に作成されます。

非接続データセットのRangeString

[??]!LooseDatasetName

サンプルの代入文は次のようになります。

range xx = [??]!tmpdata_a;       // 非接続データセット 'tmpdata_a'

この動作を見るには、 plotxy Xファンクションを使って、非接続データセットのグラフをプロットします。

//  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変数とは異なり、セションまたはローカルスコープを持ちます。Dataset変数も内部的には非接続データセットですが、非接続データセットは計算のみの使用に限られ、例えば、プロットを作成するのに使用することはできません。

範囲のメソッド

範囲変数が作成されると、以下のメソッドがこの範囲内で使用できるようになります。

メソッド 説明
range.getSize() 範囲の大きさを返すこのメソッドはデータセット範囲、例えば列、行列オブジェクト、グラフプロット、セルのブロック、非接続データセットなどで使用できます。なお、セルのブロックに関しては、範囲宣言の際の時のサブ列の大きさだけを返します。
range.setSize() 範囲の大きさをセット。このメソッドはデータセット範囲、例えば列、行列オブジェクト、グラフプロット、セルのブロック、非接続データセットなどで使用できます。なお、範囲がセルのブロックの場合、範囲宣言の際の時のサブ列の大きさだけをセットします。
range.getLayer() 範囲にレイヤ(グラフレイヤ、ワークシート、行列レイヤ)が付属している場合、このメソッドはそのレイヤのUIDを返します。レイヤ名を取得するにはメソッドの後に記号が必要です。例えば、"rng.getLayer()$ = "となります。
range.getPage() 範囲にページ(グラフページ、ワークブック、行列ブック)が付属している場合、このメソッドはそのページのUIDを返します。ページ名を取得するはメソッドの後に記号が必要です。例えば、"rng.getPage()$ = "となります。
range.getop() 範囲がワークシート列またはグラフのプロットの場合、このメソッドは範囲に関連付けられた操作のuidを返します。範囲がワークシート(階層シートを含む)の場合、このシート範囲に接続されている最初の操作のuidを返します。
range.sub(name/index) このメソッドはデータ範囲内の部分範囲を名前(name)またはインデックス(index)で取得します。このメソッドは仮想行列でのみ利用できます。例えば、ztitleという名前の仮想行列がある場合、ztitle.sub(y);(名前) または ztitle.sub(1); (インデックス)を使用してY値のデータセットを返すようにします。さらに、ztitle.sub(y)[3]=;ztitle.sub(y)[3]$=; のような表現を使用することでこのデータセットの3番目の値を取得できます。
range.reverse() このメソッドはデータセット範囲、例えば列、行列オブジェクト、グラフプロット、セルのブロック、非接続データセット等に働きます。その範囲内のデータ順を反対にします。もし範囲がセルのブロックの場合、宣言した範囲の最初のサブ列のデータ順だけを反対にします。colReverse Xファンクションは同じ事を行います。
range.empty() このメソッドは、列、行列オブジェクト、セルのブロック、ラベル行などのラベル領域とデータ領域に対して機能します。範囲内のデータとラベルをクリアします。範囲がデータ領域の場合、この範囲のデータは欠損値に設定されます。GUIでは、選択した範囲を右クリックして、コンテキストメニューで「クリア」を選択することもできます。

範囲固有の使用法

範囲データを操作する

列の範囲は直接データを操作するのに使用することができます。 列名を直接使うのではなく、範囲を使う大きなメリットは、どのページまたはレイヤがアクティブであるかを考慮する必要がないということです。

例えば、

// 2つの範囲変数, v1とv2を宣言
range [Book1]Sheet1 r1=Col(A), r2=Col(B);
 
// [book1]sheet1がアクティブな場合、col(A)=data(1,30)と同じになる 
r1 = data(1,30);                          
r2 = uniform(30);
 
// [Book1]Sheet1 がアクティブにならないように新しいウィンドウを作成
plotxy 2;                                 
sec -p 1.5;            // 遅延
r2/=4;                 // col(A)/=4は動かないが、定義した範囲は動く
sec -p 1.5;            // 遅延
r2+=.4;
sec -p 1.5;            // 遅延
r1=10+r1/3;

セルの範囲を示す列範囲変数を直接計算することができます。例えば、

range aa = Col(A)[10:19]; // 列Aの10行目から19行目
aa += 10;                 // aaのすべての要素は10ずつ増加

列の部分範囲のサポートが拡張されました。

// 列1の7行目から13行目と列2の3行目から4行目で構成される範囲
// 括弧とカンマの区切りを使用
range rs = (1[7:13], 2[3:4]); 
del rs; // Sv8.0 SR6以降でサポート

 
//  部分範囲間をコピー
range r1 = 1[85:100];
range r2 = 2;
// r1 を列2の先頭にコピー
r2 = r1; //  v8.1でサポート
// v8.1も部分範囲に完全/不完全コピー
range r2 = 2[17:22];
r2 = r1; // r1から6つの値のみコピー
range r2 = 3[50:200];
r2 = r1; // 元は16個の値があるので、65行までのみコピー

範囲の動的割り当て

列番号を変化させたり、別の範囲変数の名前を使って、実行時に自動的な方法で新しい範囲を作成できると役立つ場合があります。

列インデックスの式を使って新しい範囲を定義する

関数wcol()は、実行時に列インデックスと割り当てのために使用します。

int nn = 2;
range aa=wcol(2*nn +1);

既存の範囲を使って新しい範囲を定義する

次のスクリプトは、%( ) 置換表記wks (オブジェクト)メソッドを使って、別の範囲に基づいた新しい範囲を作成する方法を示しています。%( ) 置換で範囲変数を使用すれば、タイプしなくても、常に[Book]Sheet!文字列を認識します。

range rwks = sheet3!;
range r1= %(rwks)col(a);

この場合、新しい範囲 r1Sheet3!Col(A)となります。

既存の範囲を基にした新しい範囲を構成するこのメソッドは、ワークシート範囲を最初に宣言するようコードを集中し、列範囲を宣言するのに使用することができるので、とても役に立ちます。 ここでは、rwks 変数を使って、列をSheet 3に追加します。

rwks.addcol();

そして、範囲rwksの最後の列(一番右側)を認識する別の列を定義します。これは新しく作成された列を指します。

range r2 = %(rwks)wcol( %(rwks)wks.ncols );

適当な位置に範囲の割り当てがあると、次のように計算や代入がしやすくなります。

r2=r1/10;

これは範囲 r1 のデータを10で割り、その結果を範囲r2として宣言されている列に入れます。

<0>表記で最後の行/列を参照

<0>表記は、ある範囲の最後のインデックス(最後の行、最後の列、または最後のシート)を参照します。例えば、

range r1 = [Book]Sheet!2:0;

これは、[Book1]Sheet1のワークシートの2列目から最後の列までのブロックを指します。もし、列が追加されても、r1の範囲には自動で新しい列が含まれます。同様に、次の表記では、最後の列と最後の行を参照します。

range r2 = [Book]Sheet!2[2]:0[0];

Xファンクションの引数

多くのXファンクションは引数として範囲を使用します。例えば、Xファンクションstats は、入力としてベクトルデータを取り、その指定した範囲の記述統計量を計算します。次のように入力すると、

stats [Book1]Sheet2!(1:end); // book1の2シート目の統計量
stats Col(2);                // アクティブなワークシートの列2の統計量
 
// 列1-2, 5-10行目のセルブロックの統計量
stats 1[5]:2[10];

または、範囲変数を使って、同じような操作を行うことができます。

/* 1番目と2番目のシートの列2の3-5行目に対する範囲変数を定義 
その範囲に stats XF を実行 */
range aa = (1,2)!col(2)[3:5]; stats aa;

このXファンクションに対する入力ベクトル引数は範囲変数で指定されます。

いくつかのXファンクションは、XYRangeという特別なタイプの範囲を使います。これは本質的にはXとYを含む複合範囲でエラーバーを含めることもできます。
XYRangeの一般的なシンタックスは次の通りです。

(rangeX, rangeY)

しかし、rangeX部分を飛ばし、標準的な範囲表記を使って、XYRangeを指定します。この場合デフォルトのXデータが使われます。
次の2つの表記は、XYRangeと認識します。

(, rangeY)
rangeY

例えば、integ1 Xファンクションは入力と出力の両方でXYRangeを取ります。

// col(1) をX、col(2)をYとして積分
// 列3をX, 列4をYとして積分曲線を出力
integ1 iy:=(1,2) oy:=(3,4);
 
// 結果の積分曲線を列3にY, 列1の入力Xを共有することを除き、
// 上記と同じ
integ1 iy:=2 oy:=3;

範囲変数の一覧、削除、変換

範囲変数の一覧表示

LabTalkのlistコマンドを使って、範囲変数を含むすべてのセッション変数の名前の一覧とそれらが定義されている内容を出力します。例えば、

list a; // すべてのセッション変数を一覧表示

コマンドウィンドウでこのコマンドを実行する場合、次のように出力されます。

Session:
 1       MYRANGE   [book1]sheet1!col(b)
 2         MYSTR  "abc"
 3            PI   3.1415926535898

Origin 8.1以降、多くのスイッチ (下記) が追加され、特定のセッション変数を出力できます。

オプション 表示される対象 オプション 表示される対象
a すべてのセッション変数 aa String配列 (セッション)
ac 定数 (セッション) af ローカル関数 (セッション)
afc ローカル関数-全内容 (セッション) afp ローカル関数のプロトタイプ (セッション)
ag グラフィックオブジェクト (セッション) ar 範囲変数 (セッション)
as 文字列変数 (セッション) at ツリー変数 (セッション)
av 数値変数 (セッション) -- --

範囲変数の一覧削除

範囲変数を削除するには、LabTalkのdelコマンドを-raスイッチと一緒に使います。 例えば、

range aa=1;  // aa = アクティブワークシートのCol(1)
range ab=2;  // ab = アクティブワークシートのCol(2) 
range ac=3;  // ac = アクティブワークシートのCol(3) 
range bb=4;  // bb = アクティブワークシートのCol(4) 
list a;      //aa, ab, ac, bbを含むすべてのセッション変数を一覧表示
del -ra a*;  // 文字"a"で始まるすべての範囲変数を削除
 
// 最後のコマンドは aa, ab, acを削除

下記の表は、範囲変数を削除するオプションの一覧です。

オプション 削除/消去される対象 オプション 削除/消去される対象
ra ローカル/セッション変数 al -raと同じ
rar 範囲変数 ras 文字列変数
rav 数値変数 rac 定数
rat ツリー変数 raa 文字列配列
rag グラフィックオブジェクト raf ローカル/セッション関数

範囲をUIDに変換する

各Originオブジェクトには、ショートネームとロングネーム、ユニバーサルID UIDがあります。 範囲変数とそのUID間を変換することができ、関数 range2uid, uid2name, uid2rangeを使って、ページとレイヤの名前を取得できます。 使用例については、LabTalkオブジェクト をご覧下さい。

範囲の特殊な表記

複数シートを指定

複数のシートを参照する場合は、ワークシートのデータ範囲文字列の一般的な形式を使用し、カンマとコロンを組み合わせて範囲を指定します。


[Workbook](SheetA,SheetN:SheetM)!colBegin[rowIndex]:colEnd[rowIndex]

// 3つの範囲の基本的な組合せ
(range1, range2, range3)  

// 複数シートからの共通の列
(sheet1,sheet2,sheet3)!range1
(sheet1,sheet3:5)!range1
 
// シート範囲からの共通の列範囲  
(sheet1:sheetn)!range1

例えば

// 2つのシートから A(X)B(Y) を同じグラフにプロット
plotxy (1:2)!(1,2); 
 
// ワークブックを再びアクティブにし、シートを追加して、それらにデータを入力
// すべてのシートの2行目から10行目までのA(X)B(Y)をプロット
plotxy (1:end)!(1,2)[2:10];
// アクティブなブック内のすべてのワークシートをブック内の新しいシートに追加
wappend irng:=(1:end)!;

詳細は、下の複合範囲を参照してください。

XYとXYZ範囲

特定のXファンクションへの入力として設計されているので、XY範囲 は、2つのワークシート列にXY データの属性にした一対データです。また、XY部分範囲は、X値を使用して指定できます。同じように、XYZ 範囲は3つの要素をもち3つのワークシート列を有していて XYZデータを表わしています。


例えば、 fitpoly Xファンクションは、入力と出力の両方のXY範囲を取ります。

// 列1と2のXYデータを2次多項式でフィット
// 係数を列3、XYフィットデータを列4と列5に入れる
fitpoly iy:=(1,2) polyorder:=2 coef:=3 oy:=(4,5);

Xに対する#と ?を使ったXY範囲

Xファンクションの引数として範囲を使うため (8.0 SR3) で2つの特殊文字'?' と '#' が導入されました。'?' は、強制的にワークシート属性を使うことを示し、範囲の属性が要求に合わない場合、エラーとなります。'#' は、範囲が属性を無視し、X属性として行番号を使うことを意味します。 しかし、Y列がサンプリング情報の場合、そのサンプリング情報はXを提供するのに使われます。

例えば、

plotxy (?, 5);        // col(5)がX列の場合エラー
plotxy (#, 3);        //  Xに行番号を使い、col(3)をYでプロット

これらの表記は、ここでのサンプルのように、plotxy Xファンクションで特に役立ちます。

// 列の属性を使ってワークシートのすべての列をプロット
plotxy (?,1:end);

範囲出力でのタグ表記

多くのXファンクションは、出力範囲をテンプレート名前インデックスを含むタグで修飾する事ができます。 以下は、離散度数を求めるXファンクションdiscfreqsで使用する例です。

discfreqs irng:=1 freq:=1 rd:="[Result]<new template:=table.otw index:=3>";

これは、TABLE.OTWというテンプレートをロードして、Resultというワークブックの3番目のシートに直接出力されます。

これらタグの表記のサポートは特定のXファンクションに依存しますので、作成コードをに含める前に試すことができます。

複合範囲

複合範囲は、複数の部分範囲で構成される範囲です。 次のシンタックスを使って、複合範囲を構成します。

// 3つの範囲の基本的な組み合わせ
(range1, range2, range3)
 
// 複数シートにまたがる、一般的な列範囲
(sheet1,sheet2,sheet3)!range1
 
// シートの中の一般的な列の範囲   
(sheet1:sheetn)!range1

これがどのように動作するかを表示するには、 wcellcolor Xファンクション を使って範囲を表示し、plotxy を使ってXYRangeを表示します。少なくとも4つの列が数値データで入力されているアクティブなブック/シートを操作しているものとします。

//  いくつか異なるブロックを青にする

wcellcolor (1[1]:2[3], 1[5]:2[5], 2[7]) color(blue); 
 
// その内いくつかをフォントの色を赤にセット
wcellcolor (1[3]:4[5], 2[6]:3[7]) color(red) font;

plotxyを試すには、最初のシートにいくつか数値を入れ、新しいシートを追加し、2番目のシートにはより多くの数値を入れます。

// 両方のシートから A(X)B(Y) を同じグラフにプロット
plotxy (1:2)!(1,2); 
 
// ワークブックを再びアクティブにし、シートを追加して、それらにデータを入力
// すべてのシートの2行目から10行目までのA(X)B(Y)をプロット
plotxy (1:end)!(1,2)[2:10];

Note: 複合範囲には特有の不明瞭さがあります。例えば、(r1,r2)のように範囲 r1 と範囲 r2 で構成される範囲、 r1r2という名前の列で構成される XY範囲、例えば、(r1,r2)です。 そのため、与えた範囲変数に割り当てられているオブジェクトの種類を覚えておくことが大切です。