データ型と変数


LabTalkのデータ型

LabTalkは9つのデータ型をサポートしています。

データ型 コメント
Double double型の精度を持つ浮動小数点数
Integer 整数値
Constant 一度宣言されると変更できない数値データ型
Dataset 数値の配列
String 連続した文字
StringArray 文字列の配列
Range Originオブジェクト(ワークブック、ワークシート等)の特定の範囲を参照
Tree 枝(ブランチ)と葉(リーフ)を持つ木(ツリー)構造のデータ
グラフィックオブジェクト オブジェクト(ラベル、矢印、線及びその他ユーザーによって作成されたグラフィックエレメントなど)

数値

LabTalkは3つの数値データ型: doubleintconstをサポートしています。

  1. Double: double型の精度を持つ浮動小数点数。これはOriginのデフォルトの変数型です。
  2. Integer: 整数 (int)はLabTalkではdouble型で保存され、代入中に切り詰めされます。
  3. Constant: 定数(const)は、LabTalkで利用できる3番目の数値データ型です。 一度宣言されると、constantの値は変更できません。Origin 2016以降、constantは一度宣言されるとorgvar.ogs に自動保存されます。つまり、constantは、「システム変数として保存され、新しいOriginのセッションでも使用できることを意味します。
// 新しい変数データ型として doubleを宣言
double dd = 4.5678;
// 新しいinteger 変数を宣言
int vv = 10;
// 新しいconstantを宣言
const em = 0.5772157;

Note:

  • 新しいOriginセッションを開いた後に定数を使用するには、ユーザーファイルフォルダにあるCONST.CNFファイルで定数を定義する必要があります。
  • LabTalkにはcomplexデータ型はありません。列は複素数データタイプとして設定でき、その際は基本的な演算子(+,-,*,/)を使用して列の間の演算を行ったり、リテラル値を使用できます。複素数を入力した列値や文字式から実数部や虚数部を抽出する関数は用意されていますが、complex変数を必要とするならOrigin Cを利用してください。
// 直接、文字式
(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データ型は数値配列を保持するように設計されています。

一時非接続データセット

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をご覧下さい。

%( )の操作については、$( ) 置換-数値から文字列の変換をご覧下さい。

String

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

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

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、layer1の二番目の曲線にアクセス:  
range ll = [Graph1]Layer1!2; 
// MBook1、MSheet1の二番目の行列にアクセス:      
range mm = [MBook1]MSheet1!2;
// 非接続データセットtmpdata_aにアクセス:      
range xx = [??]!tmpdata_a;

Note:

  • セル範囲は、1つのセル、行または列(の一部)、セルグループ、非連続な複数のセルの選択ができます。
  • ワークシート、行列シート、グラフレイヤは、それぞれ、名前またはインデックスで参照することができます。
  • range変数 を定義して、originオブジェクトを表したり、直接、Xファンクションの引数としてrangeを使用することができます。
  • rangeデータ型およびrange 変数の詳細については、範囲表記を参照してください。

Tree

LabTalkは、標準的なtreeデータ型をサポートしており、これは枝(ブランチ)と葉(リーフ)を持つ木(ツリー)のような構造です。 ブランチは複数のリーフを含み、それぞれのリーフにはデータが含まれます。 ブランチとリーフを合わせたものノードと呼びます。

リーフ: 子ノードを持たないノード。値を含むことができます。
ブランチ: 子ノードを持つノード。値は含みません。

リーフノードは数値文字列データセット(vector) 型を変数をもつことができます。

// 空のツリーを宣言
tree report;        
// 割り当ての際にツリーノードが自動で追加
//レポート2には2つのブランチがあり、各ブランチには2つのリーフがある
report.user.name$="dog"; //文字列
report.user.age=22; // 数値
report.test.name$="sensor";
report.test.temp = 32.0;

report.=; //ツリーの内容を出力

// 新しいツリー'newReport'を宣言し'report’ツリーからのデータを割り当て
tree newReport = report; 
newReport.user.name$=;
newReport.test.temp=;


ツリーまたはブランチ、リーフがあるかチェック

//上述のスクリプト後に実行。あれば24を返す。そうでない場合は0を返す
exist(report)=; //24を返す
exist(report.user.name)=; //24を返す
exist(report.test.temp)=; /returns 24
exist(report.test.x)=; // 0を返す


ブランチまたはリーフかチェック

//ブランチは2、リーフは1、無効な場合0を返す
report@= //ブランチの場合2を返す
report.user@=;   // 2を返す、ブランチ
report.user.name@=; // 1を返す、リーフ
report.test.temp@=; // 1を返す、リーフ
report.test.speed@=;/// 0を返す、無効


ツリーは、Originでパラメータに関連するセットを設定および保存するためによく使用されます。ツリーデータ型は、入力または出力に関係なく、Xファンクションのツリー型引数でよく使用されます。

例えば、Xファンクションimpascを使用してOriginにデータをインポートする場合、ツリー型の引数optionsがインポートをどう実行するか決定するパラメータを保持します。これはoptionsツリーが入力引数です。

string str$ = system.path.program$ + "Samples\Graphing\Group.dat"; 
impasc fname:=str$
/* 新しいシートで開始 */ 
options.ImpMode:=4 
/* 最初の3列をインポート */
options.Cols.NumCols:=3;


Xファンクションimpinfoにはツリー型の出力引数trInfoがあります。 データをワークシートにインポートした後、次のスクリプトはファイル情報をツリー変数「fileInfo」に入力します。

impinfo trInfo:=fileInfo; 
fileInfo.= //ツリーの全ての内容を出力


ツリーノードは文字列を数値を指定できます。次の例では、文字列データと数値データを含むツリーノードをワークシート列にコピーする方法を示しています。

//ワークシートにデータファイルをインポート
newbook;
string fn$=system.path.program$ + "\samples\statistics\automobile.dat"; 
impasc fname:=fn$;
tree tr;
//2列目で離散周波数カウントを実行し結果をtrに保存
discfreqs irng:=2 rd:=tr;
newsheet name:=Result; //新しいワークシート'Result'を追加
col(1) = tr.freqcount1.data1; // 第一列に 'data1' リーフ (すべて文字列) を配置
col(2) = tr.freqcount1.count1; //2番目の列に 'count1' リーフ (数値) を配置

ツリーノードはベクトルにすることもできます。Origin 8.1 SR1より前のバージョンでは、以下のコード例のように直接代入を行う方法が、ツリー変数内のベクトルにアクセスする唯一の方法でした。

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で識別子を割り当てるとき

  • 文字と数値のどの組合せでも使えますが、以下の注意が必要です。
    • 識別子は25文字以上にすることはできません。
    • 最初の文字を数字にすることはできません。
    • アンダスコア "_" はデータセット名で特別な意味を持ちますので、使用を避けて下さい。
  • Exist (関数) を使うと、識別子がウィンドウ、マクロ、ツール、データセット、変数に名前を付けるのに使われているかどうかをチェックすることができます。
  • いくつかの一般的な識別子がシステム利用としてOriginに予約されています。これについては、システム変数をご覧下さい。
  • 列値の計算で列のショートネームとの競合を避けるため、変数名として少なくとも4文字使用して割り当てることをお勧めします。

変数名の競合の取り扱い

システム変数@ppv は、プロジェクト変数、セッション変数、ローカル変数の名前の競合をOriginがどう扱うかを際魚します。 他のすべてのシステム変数と同様に@ppvは、スクリプトからいつでも変更でき、直ちに反映されます。

変数 説明
@ppv=0 これはデフォルトのオプションで、セッション変数とローカル変数の両方ともが既存のプロジェクト変数の名前を使うことができます。 競合のイベントがでは、セッション変数またはローカル変数が使われます。
@ppv=1 このオプションは、既存のプロジェクト変数と同じ名前を持つセッション変数を宣言することを不正とします。 新しいプロジェクトをロードするとき、競合した名前を持つセッション変数は、プロジェクトが閉じられるか、同じ名前を持つプロジェクト変数が削除されるまで、無効になります。
@ppv=2 このオプションは、既存のプロジェクト変数と同じ名前を持つローカル変数を宣言することを不正とします。 新しいプロジェクトをロードするとき、競合した名前を持つローカル変数は、プロジェクトが閉じられるか、同じ名前を持つプロジェクト変数が削除されるまで、無効になります。
@ppv=3 これは@ppv=1 と @ppv=2の組合せです。この場合、すべてのセッション変数とローカル変数は、プロジェクト変数の名前を使うことができません。新しいプロジェクトがロードされる場合、同じ名前の既存のセッションまたはローカル変数は無効になります。

変数の一覧表示と削除

LabTalkコマンドのlistdel を使って、変数を一覧表示したり、変数を削除します。

/* 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)その場合、任意の時点で返される値は現在のスコープに依存することを意味します(以下のセッション変数とローカル変数を参照) 。

プロジェクト変数

  • プロジェクト変数 はOriginプロジェクトファイル(*.OPJ/OPJU)と一緒に保存されます。 プロジェクト変数は、プロジェクトスコープを持つと言われます。
  • プロジェクト変数は、double, string, dataset の変数型に対して宣言無しで自動的に作成されます。
// double型のプロジェクト(プロジェクトスコープ)変数を定義:
myvar = 3.5;
// 非接続データセット(プロジェクトスコープ)を定義:
temp = {1,2,3,4,5};
// string型のプロジェクト(プロジェクトスコープ)変数を定義:    
str$ = "Hello";
  • 他のすべての変数型は宣言する必要があり、そのデフォルトのスコープをセッションまたはローカルにします。 @globシステム変数を使ってローカル変数を強制的にセッション変数として利用可能にできます(下記参照)。

セッション変数

  • セッション変数 はOriginプロジェクトと一緒に保存されず、プロジェクトを切り替えても、現在のOriginセッションで利用できます。つまり、一度セッション変数が定義されると、その変数は、Originアプリケーションが終了するか、変数を削除するまで、存在します。セッション変数は、次のように変数宣言で定義されます。
// 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

ローカル変数

ローカル変数 は、特定のスクリプトの現在のスコープ内でのみ存在します。

次のようなスクリプトに対してスクリプトレベルのスコープが存在します。

  • 波括弧 {} で囲まれている
  • 別の *.OGS ファイルまたはOGSファイル内の個々のセクション
  • 列/行列値の設定ダイアログの内部
  • カスタムボタン(ボタンボタンスクリプト)

ローカル変数が宣言されると、セッション変数と同じ方法で値を割り当てます。

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)
  • スクリプトウィンドウ
  • コマンドウィンドウ
  • OGSファイル
  • 様々なGUIダイアログ
const av = 6.022×1023; Originが起動している間有効。すべての定数はorgvar.ogsに保存されます。
プロジェクト変数 double,
string,
dataset
しない
  • スクリプトウィンドウ
  • コマンドウィンドウ
  • OGSファイル
  • 様々なGUIダイアログ
av = 6.022×1023; OPJが開いている間有効。
OPJとともに保存。
セッション変数 全てのタイプ する
  • スクリプトウィンドウ
  • コマンドウィンドウ
double av = 6.022×1023; セッションの間有効。
OPJとともに保存不可。
ローカル変数 全てのタイプ する
  • OGSファイル
  • 様々なGUIダイアログ
double av = 6.022×1023; スクリプトが実行されている間有効。
セッション変数
としての
ローカル変数
全てのタイプ する
  • OGSファイル
  • 様々なGUIダイアログ
@glob=1;
double av = 6.022×1023;
セッションの間有効。
OPJとともに保存不可(ProjectEvents.OGS参照)。