LabTalkは9つのデータ型をサポートしています。
タイプ | コメント |
---|---|
Double | double型の精度を持つ浮動小数点数 |
Integer | 整数値 |
Constant | 数値のデータ型は一度宣言されると変更できない |
Dataset | 数値配列 |
String | 連続した文字 |
StringArray | 文字列配列 |
Range | Originオブジェクト(ワークブック、ワークシート等)の特定の範囲を参照 |
Tree | 枝(ブランチ)と葉(リーフ)を持つ木(ツリー)のような構造のデータ |
グラフィックオブジェクト | オブジェクト(ラベル、矢印、線及びその他ユーザーによって作成されたグラフィックエレメントなど) |
LabTalkは、次の3つの数値データ型をサポートしています。double, int, const.
// 新しい変数データ型として doubleを宣言 double dd = 4.5678; // 新しいinteger 変数を宣言 int vv = 10; // 新しいconstantを宣言 const em = 0.5772157;
Note:
// 直接的な文字式 (3-13i) / (7+2i) =; // (3-13i) / (7+2i)=-0.094339622641509-1.8301886792453i // 複素数列に文字式を割り当てる col(A)[3] = (3-13i) * (7+2i); // 複素数列または文字式の実数部分を入手する dReal1 = imreal(col(A)[3]); dReal2 = imreal((3-13i) + (7+2i)); // 複素数列または文字式の虚数部分を入手する dImag1 = imaginary(col(A)[3]); dImag2 = imaginary((3-13i) - (7+2i));
![]() | 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 |
Datasetデータ型は、数値配列を保持するように設計されています。
dataset変数を宣言すると、それはローカルな一時データセットとして内部的に保存されます。 一時データセットは、Originプロジェクトと一緒に保存されず、特定のワークシートとは結びついていません。 一時データセットは、計算のみに使用され、プロット用に使用することはできません。
以下のサンプルでは、データ型の使用法を紹介します(Dataset型の宣言と$ 置換表記を使用します。)
// 1から10で、増分0.2の値を持つ // データセット 'aa' を宣言 dataset aa={1:0.2:10}; // integer型 'nSize'を宣言し、 // これに新しい配列の長さを割り当て int nSize = aa.GetSize(); // スクリプトウィンドウに'aa'の長さを出力 type "aa has $(nSize) values";
vectorデータを代入(宣言せずに)または Create (コマンド) を使って、データセットを作成すると、それは、プロジェクトレベルのデータセットとなり、 計算またはプロット用に使用することができます。
代入によるプロジェクトレベルデータセットの作成
bb = {10:2:100}
または Create コマンドを使う方法
create %(strWks$) -wdn 10 aa bb;
プロジェクトレベルまたはローカルレベルの変数についての詳細は、以下の変数のスコープのセクションをご覧下さい。
データセットの操作については、Datasetsをご覧下さい。
%( )の操作については、$( ) 置換-数値から文字列の変換をご覧下さい。
LabTalkでは、文字列変数および文字列レジスタの2つの方法で文字列を扱います。
文字列変数は、宣言と代入で作成されたり、代入のみ(定義された変数スコープによる)で作成されます。そして、LabTalkでは連続した文字の名前に$記号を付けて表されます。(下記の命名規則を参照) (例、stringName$)
// 宣言と割り当てによりローカル/セッションスコープで文字列を作成 // "greeting"という文字列を作成し // 値"Hello"を割り当て: string greeting$ = "Hello"; // $終了は、宣言ではオプションですが、割り当てには必須 string FirstName, LastName; FirstName$ = Isaac; LastName$ = Newton; // 宣言なしで割り当ててプロジェクト文字列を作成: greeting2$ = "World";//プロジェクトスコープ。OPJで保存 // 文字列変数は文字列クラスメソッドを利用できる string str$ = Johann Sebastian Bach; str.Find('Sebastian')=; // リテラル文字列を定義 // 構文<[<は、リテラル文字列の開始を示す // >]> はリテラル文字列の終了を示す // 文字列に二重引用符などの特殊記号を含めるために使用できる string s1$ = <[<a"b'";"c">]>; s1$=; // a"b'";"c"を返す //Xファンクション引数でリテラル文字列を使用 // 現在選択されているワークシート列に3行を入力 patternT text:=<[<"Sample A" "Sample B" "Sample C">]>;
文字列変数の操作については、文字列の処理項目を参照してください。
文字列を文字列レジスタに保存することもできます。これは、%記号にアルファベット文字を付けて表します。(例、%A-%Z)文字列レジスタは常にグローバルスコープになります。
/* 文字列レジスタ%Aに文字列"Hello World"を割り当て */ %A = "Hello World";
![]() | Originの現在のバージョンでは、文字列の操作については、いくつかの役立つメソッドがあるので、文字列変数を使用することをお勧めします。詳細は、String(オブジェクト)をご覧下さい。 文字列レジスタを既に使っている場合、その使用法については、 文字列レジスタをご覧下さい。 |
StringArrayデータ型は、Datasets データ型が数値配列を扱うのと同じように、文字列の配列を扱います。 String データ型と同様に、StringArrayもいくつかの組込のメソッドがあります。詳細は StringArray (オブジェクト)をご覧下さい。
次のサンプルは、StringArrayの使用方法を示すものです。
// "aa"という文字列配列を宣言, // そして、組込のメソッドAddとGetSizeを使う StringArray aa; // aaは空白の文字列配列 aa.Add("Boston"); // ここでaaに1つの要素: "Boston"をいれる aa.Add("New York"); // aaに2つ目の要素、"New York"を入れる /* "aa has 2 strings in it" と出力*/ type "aa has $(aa.GetSize()) strings in it:"; loop(ii,1,aa.GetSize()) { ty aa.GetAt(ii)$; }
range データ型は、ワークブック、ワークシート、グラフ、レイヤ、ウィンドウ等にある特定の領域を参照するOriginのデータに関連するオブジェクトにアクセスできます。
一般的なシンタックスは
range rangeName = [WindowName]LayerNameOrIndex!DataRange[subRange]
これは、ワークブック、行列、グラフ内の特定のデータにアクセスします。
range rangeName = [BookName]SheetNameOrIndex!ColumnNameOrIndex[RowBegin:RowEnd]
range rangeName = [MatrixBookName]MatrixSheetNameOrIndex!MatrixObjectNameOrIndex[CellBegin:CellEnd]
range rangeName =[GraphName]LayerNameOrIndex!DataPlotIndex[RowBegin:RowEnd]
一時データセットにアクセスするrange変数を作成するには特別なシンタックス [??] が使われます。
例えば、
// Book1のSheet2にある列3にアクセス range cc = [Book1]Sheet2!Col(3); // Graph1のレイヤ1にある2番目の曲線にアクセス range ll = [Graph1]Layer1!2; // MBook1のMSheet1にある2番目の行列オブジェクトにアクセス range mm = [MBook1]MSheet1!2; // tmpdata_a非接続データセットにアクセス range xx = [??]!tmpdata_a;
Note:
LabTalkは、標準的なtreeデータ型をサポートしており、これは枝(ブランチ)と葉(リーフ)を持つ木(ツリー)のような構造です。 ブランチは複数のリーフを含み、それぞれのリーフにはデータが含まれます。 ブランチとリーフを合わせたものノードと呼びます。
リーフノードは数値、文字列、データセット(ベクター)型を変数をもつことができます。
ツリーは、複数のパラメータをセットしたり、保存するためにOriginで使われます。 例えば、データセットをOriginワークスペースにインポートするとき、オプションと呼ばれるツリーは、インポートをどのように実行するかを決定するパラメータを保持します。
具体的な例として、次のコマンドはファイル"SampleData.dat"からASCIIデータをインポートし、インポートが扱われる方法を制御するためオプションツリー内の値をセットします。 ImpModeリーフに4という値をセットすると、新しいワークシートにデータをインポートするようOriginに通知されます。 (Colsブランチにある)NumColsリーフに3という値をセットすると、 SampleData.dat ファイルの最初の3列のみをインポートするようOriginに通知されます。
string str$ = system.path.program$ + "Samples\Graphing\Group.dat"; impasc fname:=str$ /* 新しいシートを開始 */ options.ImpMode:=4 /* 最初の3列のみインポート*/ options.Cols.NumCols:=3;
aaという名前のツリー変数を宣言します。
// 空のツリーを宣言 tree aa; // 割り当て際にツリーノードが動的に追加される: aa.bb.cc=1; aa.bb.dd$="some string"; // 新しいツリー'trb' を宣言し、ツリー'aa'からのデータを割り当て: tree trb = aa;
ツリーの存在、およびツリー上のリーフとブランチの存在を確認します。
Tree tr; exsit(tr)=; //このツリーが存在する場合、24を返し、それ以外の場合、0を返す tr.a.b=1; tr.a@=; /// ブランチ用に2を取得 tr.a.b@=; /// リーフ用に1を取得 tr.a.b1@=;/// 0を取得、無効
treeデータ型は、入力および出力データ構造の両方として、Xファンクションで頻繁に使われます。例えば、
// インポートするファイルの情報を 'trInfo'に割り当て impinfo t:=trInfo;
ツリーノードは文字列にすることができます。以下のサンプルは、文字列データのツリーをワークシート列にコピーする方法です:
//ワークシートにデータファイルをインポート newbook; string fn$=system.path.program$ + "\samples\statistics\automobile.dat"; impasc fname:=fn$; tree tr; //列の統計を実行し、その結果をツリー変数に保存する discfreqs irng:=2 rd:=tr; // ワークシート列に文字列を割り当てる newsheet name:=Result; col(1) = tr.freqcount1.data1; col(2) = tr.freqcount1.count1;
ツリーノードはベクター型にすることもできます。Origin 8.1 SR1のより前までは、Tree変数内のベクターにアクセスする唯一の方法は、以下のサンプルに示すように、直接代入することでした。
tree tr; // データセットをツリーノードに代入すると // 自動的にベクターノードになる tr.a=data(1,10); // ベクターツリーノードは列に割り当てできる col(1)=tr.a; // ベクターツリーノードは非接続データセットに代入でき、 // これは、ツリーノードが直接計算するのに使えないので、便利 dataset temp=tr.a; // 非接続データセットで計算を実行 col(2)=temp*2;
ベクターツリーノードの要素には、次のような記述で直接アクセスできます:
// 上記のサンプルに続く操作 col(3)[1] = tr.a[3];
これは、ベクター tr.a の3番目の要素を現在のワークシートの1行3列目に代入します。
また、下記のように分析結果をツリー変数に出力することもできます。
newbook; //ワークシートにデータファイルをインポートする string fn$=system.path.program$ + "\samples\Signal Processing\fftfilter1.dat"; impasc fname:=fn$; tree mytr; //FFTを実行し、結果をツリー変数に保存 fft1 ix:=col(2) rd:=mytr; page.active=1; col(3) = mytr.fft.real; col(4) = mytr.fft.imag;
ツリーに関する詳細はOriginプロジェクトの章、メタデータにアクセスするセクションをご覧ください。
新しいLabTalkの変数型を使うと、ブック/レイヤ内のグラフィックオブジェクトをGObjectで制御できます。
一般的なシンタックスは:
GObject name = [GraphPageName]LayerIndex!ObjectName;
GObject name = [GraphPageName]LayerName!ObjectName;
GObject name = LayerName!ObjectName; // アクティブグラフ
GObject name = LayerIndex!ObjectName; // アクティブグラフ
GObject name = ObjectName; // アクティブレイヤ
すでに存在するオブジェクトと、まだ作成されていないオブジェクト両方にGobject変数を示すことができます。
例えば、
GObject myLine = line1; draw -n myLine -l {1,2,3,4}; win -t plot; myLine.X+=2; /* myLineが、アクティブでない別のグラフにあったとしても、それを制御することは可能*/
グラフィックオブジェクトとそのプロパティおよびメソッドについての説明は、グラフィックオブジェクトをご覧下さい。
変数は、単に特定のデータ型のインスタンスです。 各変数には、名前または識別子があり、識別子は変数にデータを割り当てたり、変数からデータにアクセスするのに使われます。 この代入演算子は等号 (=)で、同時に変数を作成(存在しない場合)して、それに値を割り当てるのに使われます。
変数、データセット、コマンド、マクロ名は、識別子として一般に参照されます。 LabTalkで識別子を割り当てるとき
@ppv システム変数は、プロジェクト変数、セッション変数、ローカル変数の名前の競合をOriginがどのように扱うかを制御します。 他のすべてのシステム変数と同様に@ppvは、スクリプトからいつでも変更でき、直ちに反映されます。
変数 | 説明 |
---|---|
@ppv=0 | これはデフォルトのオプションで、セッション変数とローカル変数の両方ともが既存のプロジェクト変数の名前を使うことができます。 競合のイベントが発生すると、セッション変数またはローカル変数が使われます。 |
@ppv=1 | このオプションは、既存のプロジェクト変数同じ名前を持つセッション変数を宣言することを不正とします。 新しいプロジェクトをロードするとき、競合した名前を持つセッション変数は、プロジェクトが閉じられるか、同じ名前を持つプロジェクト変数が削除されるまで、無効になります。 |
@ppv=2 | このオプションは、既存のプロジェクト変数同じ名前を持つローカル変数を宣言することを不正とします。 新しいプロジェクトをロードするとき、競合した名前を持つローカル変数は、プロジェクトが閉じられるか、同じ名前を持つプロジェクト変数が削除されるまで、無効になります。 |
@ppv=3 | これは@ppv=1 と @ppv=2の組合せです。この場合、すべてのセッション変数とローカル変数は、プロジェクト変数の名前を使うことができません。新しいプロジェクトがロードされる場合、同じ名前の既存のセッションまたはローカル変数は無効になります。 |
LabTalkコマンドのlist とdel を使って、変数を一覧表示したり、変数を削除します。
/* LabTalkコマンドの"list"には変数を表示するさまざまなオプションがあります。 リストはデフォルトでスクリプトに出力されます。 */ list a; // 全てのセッション変数を表示 list v; // 全てのプロジェクトおよびセッションの変数を表示 list vs; // 全てのプロジェクトおよびセッションの文字列変数を表示 list vt; // 全てのプロジェクトおよびセッションのツリー変数をリスト // LabTalk コマンド "del" を使用し、全ての変数を削除 del -al <variableName>; // 特定のローカルまたはセッション変数を削除 del -al *; // 全てのローカルまたはセッション変数を削除 // LabTalk変数のビューアもある // "ed" コマンドはビューアを開く list; // LabTalk 変数ビューアを開く
一覧表示および削除のすべてのオプションについては(言語リファレンス:コマンドリファレンス)の List (コマンド)および Del (コマンド) をご覧ください。
オプションが指定されていない場合、List または Edit コマンドを実行するとLabTalkの変数と関数ダイアログが開き、すべての変数および関数を一覧表示します。
変数が宣言される方法により、そのスコープが決まります。 宣言無しで作成された変数 (double, string, dataset のみ)は、プロジェクト変数になり、Originのプロジェクトファイルとともに保存されます。 宣言された変数は、ローカルまたはセッション変数になります。 LabTalkのスコープは、3つの可視のレベルで構成されます。
これは、(a)同じ名前の複数の変数を持つことができ、(b)その場合、任意の時点で返される値は現在のスコープに依存することを意味します(以下のセッション変数とローカル変数を参照) 。
// double型のプロジェクト(プロジェクトスコープ)変数を定義: myvar = 3.5; // 非接続データセット(プロジェクトスコープ)を定義: temp = {1,2,3,4,5}; // string型のプロジェクト(プロジェクトスコープ)変数を定義: str$ = "Hello";
// double型の変数を定義 double var1 = 4.5; // 非接続データセットを定義 dataset mytemp = {1,2,3,4,5};
プロジェクト変数とセッション変数を同じ名前にすることができます。この場合、セッション変数が優先されます。
aa = 10; type "First, aa is a project variable equal to $(aa)"; double aa = 20; type "Then aa is a session variable equal to $(aa)"; del -al aa; type "Now aa is project variable equal to $(aa)";
そして、出力は
First, aa is a project variable equal to 10 Then aa is a session variable equal to 20 Now aa is project variable equal to 10
ローカル変数 は、特定のスクリプトの現在のスコープ内でのみ存在します。
スクリプトレベルのスコープが次のようなスクリプトに対して存在します。
ローカル変数が宣言されると、セッション変数と同じ方法で値を割り当てます。
loop(i,1,10){ double a = 3.5; const e = 2.718; // 他のスクリプト行 } //"a" および "e" は、{}で囲まれたコードの内部にだけ存在する
セッション変数またはプロジェクト変数と同じ名前を持つローカル変数を持つことが可能です。 この場合、スクリプトのスコープ内で、同じ名前のローカル変数、セッション変数、プロジェクト変数が存在する場合、ローカル変数が優先されます。例えば、以下のスクリプトを実行する場合(以下のようなスクリプトの実行について詳細は、LabTalkスクリプトをファイルから実行を参照してください)
[Main] double aa = 10; type "In the main section, aa equals $(aa)"; run.section(, section1); run.section(, section2); [section1] double aa = 20; type "In section1, aa equals $(aa)"; [section2] // このセクションはローカル変数'aa'を宣言しない // 次の順序で'aa'という名前の変数を検索 // 'aa'という名前のセッション変数が存在する場合、それを使用 // そうでない場合、'aa' という名前のプロジェクト変数が存在する場合は、それが使用されます。 //それ以外の場合、このセクションが別のセクションおよび呼び出し元から呼び出されたとき //セクションは 'aa' という名前のローカル変数を宣言し、それを使用 // それ以外の場合、'aa' は欠損値になります。 type "In section2, aa equals $(aa)";
Originは次のように出力します。
In the main section, aa equals 10 In section1, aa equals 20 In section2, aa equals 10
*.OGS ファイルで変数または関数を定義したい場合、スクリプトウィンドウやテキストラベルなどからそれらを使用できる場合があります。(通常、ローカル変数や関数はOGS完了まで実行されたときに存在しなくなります)。このようにするには、@globシステム変数を1にします(デフォルト値は0)。これにより、OGSファイルのローカル変数と関数をセッション内で使用できます。
[Main] @glob = 1; // 以下の宣言がセッションで利用可能になります range a = 1, b= 2; if(a[2] > 0) { // ローカルスコープ開始 range c = 3; // この宣言はセッション内で利用可能 }
*.OGSを終了すると、@glob 変数は自動的にそのデフォルト値である 0に戻ります。
@globを次のように開始位置と終了位置に配置して、コードブロックを制御できます。
@glob=1; double alpha=1.2; double beta=2.3; Function double myPeak(double x, double x0) { double y = 10*exp(-(x-x0)^2/4); return y; } @glob=0; double gamma=3.45;
上記のスクリプトでは、変数alpha、beta、およびユーザー定義関数myPeakをセッション内で使用できます。一方、変数gammaは、@glob がデフォルト値である0に戻ってから宣言されたため、利用できません。
データ型 | 宣言 | 定義される場所 | サンプル | 有効な期間 | |
---|---|---|---|---|---|
定数 | constant | する (const) |
|
const av = 6.022×1023; | Originが起動している間有効。すべての定数はorgvar.ogsに保存されます。 |
プロジェクト変数 | double, string, dataset |
しない |
|
av = 6.022×1023; | OPJが開いている間有効。 OPJとともに保存。 |
セッション変数 | 全てのタイプ | する |
|
double av = 6.022×1023; | セッションの間有効。 OPJとともに保存不可。 |
ローカル変数 | 全てのタイプ | する |
|
double av = 6.022×1023; | スクリプトが実行されている間有効。 |
セッション変数 としての ローカル変数 |
全てのタイプ | する |
|
@glob=1; double av = 6.022×1023; |
セッションの間有効。 OPJとともに保存不可(ProjectEvents.OGS参照)。 |