置換表記


イントロダクション

スクリプトが実行される時、それはLabTalkのインタプリタに送られます。 そして、その操作の中でインタプリタは、%と$で始まる2種類の特別な置換表記を探します。 置換表記が見つかると、次のセクションで説明しているように、インタプリタは元の文字列を別の文字列で置き換えます。 置換された文字列の値は、その文が実際に実行されるまで分かりません。 したがって、この手順は実行時文字列置換と呼ばれます。

以下に説明するように、3つの置換法があります。

  • 文字列レジスタ置換%A - %Z
  • %( )置換%(str$)%(range), ワークシート情報、列データセット名、ワークシートセル、凡例などの置換に利用する表記
  • $( )置換、$(expression) は、数式を解釈し、結果を文字列の形式にする

%A - %Z

文字列レジスタは、最も簡単な置換の形式です。 文字列レジスタは、スクリプト実行中にその内容によって置換されます。例えば、

FDLOG.Open(A);   // ダイアログからファイル名を%Aに入れる
%B=FDLOG.path$;  //  ファイルパスを%Bに入れる
doc -open %B%A;  // %B%A はフルパスとファイル名の形式

文字列レジスタは、Origin8でより信頼性の高い文字列変数が導入される前の古いスクリプトでよく使われています。文字列変数を解釈するには、%( )置換が使われます。これについては、次のセクションで説明します。

%( ) 置換

文字列式の置換

LabTalkコマンドは数値の式を受け付けますが、文字列の式は受け付けません。そのため文字列を引数とする必要がある場合、%( )置換を使った文字列変数または文字列式を渡して、実行時の値を解釈する必要があります。文字列式の最も簡単な形式は、次の例のような1つの文字列変数です。

string str$ = "Book2";         
win -o %(str$) {wks.ncols=;}

ワークシート列とセルの置換

次の表記は、文字列としてワークシートセルにアクセスしたり、どのブックのシートからでも列のデータセット名を取得できます。Origin 8以前は、各ブックには1つのシートしかなかったので、ブック名だけでその内容を参照できました。最近のバージョンでは、複数のワークシートをサポートしているので、そのブックに1つのシートだけが含まれていることが確実でなければ、[workbookname]sheetNameorsheetIndex の形式で特定のシートにアクセスします。

個別セルの内容を返す

  • %(workbookName, column, row) -- ブックのアクティブシートを参照
  • %([workbookname]sheetname, column, row) -- ブックおよびシートを指定


例えば、Book1のアクティブワークシートの4番目の列の3行目のセルに25という値が含まれている場合、スクリプトウィンドウに次のステートメントを入力すると、Aを25にセットし、その値を2倍して同じワークブックの"Results"シートの1列目4行に入力します。

A = %(Book1, 4, 3);
%([Book1]Results, 1, 4) = 2 * A;


テキストセルの内容を得るには、文字列変数に代入します。

string strVar$ = %(Book1, 2, 5); // Note :ここでは '$' は必須ではありません
strVar$ = ;

戻り値のフォーマット

  • Origin 8.1より前のバージョンでは、列および行番号のみ指定でき、数値セルには常にフル精度で値が返されました。
  • Origin 8.1では、列に対しては、インデックスと列名の両方がサポートされ、に対しては、ラベル行の文字(例えばロングネームはL)もサポートされています。
  • さらに、この構文は指定したフォーマットで値を返すためのオプションのフォーマット引数をサポートしています(%([workbookname]sheetname, column, row[,format]))。

"W" および"@WL"で現在の列フォーマットの値を返す

文字「W」を「format」パラメータとして使用して、現在の列形式で値を返します。


例:

Book2のsheet3のcol(Signal)[3]に 12.3456789という数値があるものとしますが、小数点以下2桁が表示されます(この設定は列プロパティダイアログで行います)。

//現在の列フォーマットを使って文字列Wをフォーマット
//12.34が返されます
type "Col(Signal)[3] displayed value is %([Book2]Sheet3,Signal,3,W)";
//フォーマット指定がない場合フル精度
A=%([Book2]Sheet3,Signal,3);
A=;// 12.3456789が表示されます
//または他のフォーマット置換を使用
type "Showing 3 decimal places:%([Book2]Sheet3,Signal,3,.3)";


他のシンタックスを使用してデータの表示フォーマットを管理します。セルのフォーマットダイアログまたは列プロパティダイアログを使用して編集します。

%([workbookName]sheetName, @WL, column[row], W)


例:

// または表示フォーマットを保つため、@WL オプション付きの他の表現を使用 
type "Col(Signal)[3] displayed value is %([Book2]Sheet3, @WL, Signal[3], W)";
//フル精度が指定されていない場合
B=%([Book2]Sheet3,@WL, Signal[3]);
B=;// 12.3456789

Origin 9.1以降のフォーマット文字W は、以前のバージョンのC の代わりです。しかし、Originは、現在の列フォーマットの値を返すために%([workbookName]sheetName, column, row,C) の使用をサポートしています。

別のシートのデータセットを含めた計算

ブックまたはシートからデータセット名を取得する(データセット置換)機能は、次のような異なるシートにある列間の計算を行うのにとても役立ちます。

// Sheet2とSheet3のcol(1)を合計し、アクティブシートのcol(1)に入れる 
col(1)=%([%H]sheet2, 1) + %([%H]sheet3, 1);
 
// Book2の最初のシートでcol "signal"を減算 
// そして、アクティブブックのSheet3の列"calibrated"に結果を入れる
%([%H]sheet3, "calibrated")=col(signal) - %([Book2]1,signal);

ロングネームを使う場合、column 名は引用符で囲む必要があります。引用符が無い場合、Originは最初にショートネームを探し、見つからなければ、ロングネームを使用しようとします。上記のサンプルで、

%([%H]sheet3, "calibrated")

は、強制的にロングネームを探しますが、

%([Book2]1,signal)

は、ショートネームを持つ列が無かった場合のみロングネームを使います。

ワークシート情報の置換

置換表記でのワークシート列とセルへのアクセスと同様、@置換 (ワークシート情報置換)は、@文字を使って、2番目の引数にある列インデックスまたは列名とは区別されます。この表記は、ワークシート情報とメタデータにアクセスできます。

上記のワークシートの列とセルの置換表jきと同様に、1枚のウィンドウにはまだサポートされている古い構文がありますが、新しい表記(Origin 8で導入)を使用することをお勧めします。

ワークシートの情報を返すには

  • %(workbookName, @option, columnNumber) -- 名前付きブックのアクティブシートを参照
  • %([workbookName]worksheetName, @option, columnNumber) -- シートとブックを指定


ここで、オプション は以下(パラメータcolumnNumberはいくつかのオプションで省略されます)のうち一つになります。

オプション 返される値
@# ワークシートの列の総数を返します。
@CS columnNumber列から右に数えて、一番最初の選択されているY列の列インデックス(columnNumber列を含む)を返します。
@E# columnNumber=1の場合、ワークシート内のYエラー列数を返します。 columnNumber=2の場合、現在選択されている領域内のYエラー列数を返します。 columnNumber が省略されている場合、columnNumber は1と見なされます。
@H# columnNumber=1の場合、ワークシート内のXエラー列数を返します。 columnNumber=2の場合、現在選択されている領域内のXエラー列数を返します。 columnNumber が省略されている場合、columnNumber は1と見なされます。
@P %Hとともに使用して、アクティブウィンドウのプロジェクトエクスプローラ(PE)パスを返します(%(%H, @P))。
@PC ページのコメントを返します。
@PCn ページコメント、n 番目のみ
@PL ページのロングネームを返します。
@PN ページのショートネームを返します。
@SN シート名を返します。
@SC シートコメントを返します。
@OY 選択されている列の1番左のY列から数えた、columnNumber列までのオフセットを返します。
@OYX 選択されている列の1番左のY列から数えた、columnNumber列までのY列のみのオフセットを返します。
@OYY 選択されている列の1番左のY列から数えた、columnNumber列までのX列のみのオフセットを返します。
@T 列のXY属性を返します。 1はY列を、2は無属性を、3はエラーバー列を、4はX列を、5は列ラベルを、6はZ列を、7はXエラーを意味します。
@X ワークシートの最も左にあるX列の列番号を返します。 列は左から右へ、列番号が1から順に大きくなります。 %(worksheetName,@X);という記法を使います。
@Xn ワークシートの最も左にあるX列のショートネームを返します。 %(worksheetName,@Xn);という記法を使います。
@Y 選択されている列の1番左の列から数えた、columnNumber列までのオフセットを返します。
@Y- 指定した列を右に捜していき、最初に見つかったY列の列番号を返します。 指定した列がY列であれば、columnNumberを返します。Y列が見つからなければ、0を返します。 %(worksheetName,@Y-,ColumnNumber);という記法を使います。
@Y# columnNumber=1の場合、ワークシートのY列の数を返します。 columnNumber=2の場合、現在選択されている領域内のY列の数を返します。 columnNumber が省略されている場合、columnNumber は1と見なされます。
@Y+ 指定した列を右に捜していき最初に見つかったY列の列番号を返します。 指定した列がY列であれば、columnNumberを返します。Y列が見つからなければ、0を返します。 %(worksheetName,@Y+,ColumnNumber);という記法を使います。
@YS columnNumber列から右に数えて、一番最初の選択されているY列の番号(columnNumber列を含む)を返します。
@Z# columnNumber=1の場合、ワークシート内のZ列の数を返します。 columnNumber=2の場合、現在選択されている領域内のZ列の数を返します。 columnNumber が省略されている場合、columnNumber は1と見なされます。

この表のオプションは、@ option または @ variablesで識別できます。このテキストラベルオプションページの@ option はワークシート情報置換で使用されます。

情報の保存とインポートしたファイルの情報

@W変数は、Originのワークブックおよびワークシート、列だけでなく、インポートしたファイルに保存されているメタデータにアクセスします。

上記と同様のシンタックスを使って、列番号を変数またはノードの情報で置き換えます。

%([workbookName]worksheetName!columnName, @option, varOrNodeName)

オプション 返される値
@W varOrNodeName の情報を返します。この変数はそのワークブックレベルにあると理解され、ワークブックオーガナイザで確認できます。使用されている場合worksheetName!ColumnNameで特定する必要はありません。
@WFn n番目のインポートしたファイルに対してvarOrNodeNameの情報を返します。変数はワークブックオーガナイザで確認できます。
@WS varOrNodeName の情報を返します。この変数はそのワークブックレベルにあると理解され、ワークシートオーガナイザで確認できます。使用されている場合、ColumnNameで特定する必要はありません。
@WC varOrNodeName の情報を返します。この変数はその列レベルにあると理解され、列プロパティダイアログで確認できます。


@置換の例

次のスクリプトは、現在選択されている範囲の最初の列の列名を返します。(selc1数値システム変数に関する情報に関しては、システム変数 を参照してください。)

%N = %(%H, @col, selc1);  %N =;

このスクリプトは、アクティブウィンドウのプロジェクトエクスプローラーパスを返します。

%P = %(%H, @P); %P=;

次の行は、アクティブページのロングネームを文字列変数に返します。

string PageName$ = %(%H, @PL);

以下のスクリプトはBook2、Sheet3の4番目の列に対して列の種類を返します。

string colType$ = %([Book2]Sheet3, @T, 4);  
colType$=;

インポートフィルタは、ワークブックと一緒に保存されるインポートファイルについての情報のツリー構造を作成することができます。 ここで、複数ファイルのインポートに対して、現在のブックにインポートされた3番目のデータセットのポイント数を返します。

%z=%(%H,@WF3,variables.header.noofpoints);
%z=

現在のアクティブワークシートが6つの列(XYYYYY)を持っているとします。もし、列2,4,5が選択されているとすると、以下のスクリプトは、columnNumber列(3つ目の引数)から右に数えて、1番最初の選択されたY列番号(columnNumber列を含む)を返します。

loop(ii,1,6)
{
    type -l %(%H, @YS, ii),;
}
type;

次のように出力されます。

2,2,4,4,5,0,

凡例と軸タイトルの置換

グラフの凡例と軸タイトルも %( )置換を使うことができます。最初の引数は整数値で、最初の引数がワークシート指定子であるような他の%( )置換とは区別されなければなりません。凡例と軸タイトルの置換のシンタックスは次のようになります。

%(PlotIndex[, @option])

ここで、PlotIndex は現在のレイヤにあるデータプロットのインデックスあるいは、クエスチョンマーク("?")です。多くのオプションをPlotIndex の後に指定でき、通常、データセットと結びついているプロット属性の文字(X, Y, Z)であり、指定していなければ、Yと見なされます。指定されていれば、@オプションは、凡例の内容を制御します。 例えば、

// 現在のグラフレイヤの凡例で
// 最初の従属データセットのロングネームを表示
legend.text$ = %(1Y, @LL)  
 
// 同等のコマンド(デフォルトのYが使われる)
legend.text$ = %(1, @LL)

次のスクリプトは、凡例に2番目の独立データセット(例; X)のショートネームを表示します。

legend.text$ = %(2X, @LS)

%(?Y) は軸タイトルを、インデックス(1,2,...n)ではなく、事前に指定されたデータプロットインデックス(作図の詳細:凡例/タイトル:自動軸タイトルのデータプロットインデックスで設定)にデフォルトで設定する可変構文です。 Yデータのロングネームとそれに続く単位を左Y軸のタイトルとして<>内に表示するには、次のようにします。

yl.text$ = %(?Y,@(@LL<@LU>));


凡例の置換表記ページの詳細な情報と、@オプションの完全なリストのテキストラベルオプションページを参照してください。

Note: この凡例の変更スタイルは、単一の凡例項目のみの変更に限られますが、作図の詳細ダイアログで使用することができるよう構成されています。

legendupdate Xファンクションは、スクリプトから凡例を編集するより簡単で包括的な方法を提供します。

キーワード置換

%( )置換表記は、タブや改行コードなどの 非出力文字 (制御文字とも言う)を挿入するためにも使われます。 LabTalkキーワードを使って、これらの非出力文字にアクセスします。 例えば、

// 改行、ラインフィード(CRLF)を文字列に挿入
string ss$ = "Hello%(CRLF)Goodbye";
ss$=;     // ANS:&apos;Hello&apos;, &apos;Goodbye&apos; が別の行に出力
// 直接入力可能
type ss$;
// または%()置換を使って、文字列変数を表示
ty I say %(ss$) you say;

$( )置換

数値を文字列に変換するには$()置換表記を使用します。 この表記は、与えられた数式を実行時に評価し、その結果を文字列に変換して置き換えます。

この表記は、次のような構成で使用します。

$(expression [, format])

ここで、expression は数式ですが、通常、1つの数値または変数(データセットまたはデータ範囲)であり、 format は、Originの出力形式またはC言語形式にすることができます。

expression がデータセットまたは範囲変数の場合、スケール区切りの値リストを返します。(利用可能なバージョン: 9.1 SR0以降)

例:

//データセットを定義
dataset ds1 = {1, 3, 5, 7};
//置換表記の結果を出力
type $(ds1);//ANS:1 3 5 7;
type $(ds1, *2);//ANS: 1.0 3.0 5.0 7.0
/第1列の値を範囲変数rxに渡す
range rx = col(1);
//置換表記の結果出力
type $(rx);

デフォルトフォーマット

角括弧は、format$() 置換表記に対して任意の引数であることを示します。 もし、format を除外すると、Originは@SDシステム変数(デフォルト値は14)により指定された桁または有効桁数でexpressionを実行します。 例えば、

double aa =  3.14159265358979323846;
type $(aa);    // ANS: 3.1415926535898

Originフォーマット

Originは、ワークシートまたはテキストラベルの数値のカスタムフォーマットをサポートしています。以下は部分的なリストであり、概念を示すためだけのものです。数値フォーマットオプションの全リストは、Reference Tables: Origin Formatsを参照してください。


フォーマット 説明
*n n 桁の有効桁数を表示
.n n 桁の小数桁数を表示
*n* n 桁の有効桁数を表示, 桁数以下の0を消去
.n, カンマ区切り記号を使用して、小数点以下n桁を表示(US, UK, など)
E.n 工学表記でn 桁の小数桁数を表示します。
S*n 1E3の形式の科学表記で n 桁の有効桁数を表示
D<format> カスタム日付形式を表示します。ここで、<format> は、列プロパティ表示リストの先頭から始まる、フォーマットのインデックス番号(0からカウント)または、これらの日時形式指定子を使用して作成された文字列のいずれかです。下のサンプルをご覧ください。
T<フォーマット> カスタム時間形式を表示します。ここで、<format> は、列プロパティ表示リストの先頭から始まる、フォーマットのインデックス番号(0からカウント)または、これらの時間形式指定子を使用して作成された文字列のいずれかです。下のサンプルをご覧ください。
#n 整数値をn桁で表示、必要な場所で、0を付加
<prefix>##<sep>###<suffix> 指定したセパレータ(<sep>)を桁の間に表示。オプションで接頭語(<prefix>) や接尾語(<suffix>)を追加1つの記号は1桁を意味します。最後のは単位桁を参照します。最初と2番目の部分にある#の両方の数は、変化できます。
# #/n n を分母として指定して、数値を小数として丸めて表示します。分子と分母はスラッシュ/で区切られます。分子の桁数は調整されます。
D[<space>]M[S][F][n] 度数をDegree° Minute&apos; Second"の形式で表示します。ここで、1度= 60分、1分= 60秒です。それぞれを区切るためにスペースを挿入します。N は、分数の小数点以下の桁を示します。Fは、記号なしで区切り記号としてスペースを挿入して次数を表示します。


例:

xx = 1.23456;
type "xx = $(xx, *2)";  // ANS: 1.2
type "xx = $(xx, .2)";  // ANS: 1.23
yy = 1.10001;
type "yy = $(yy, *4)";   // ANS: 1.100
type "yy = $(yy, *4*)";  // ANS: 1.1
zz = 203465987;
type "zz = $(zz, E*3)";  // ANS: 203M 
type "zz = $(zz, S*3)";  // ANS: 2.03E+08
type "$(date(7/20/2009), D1)";  // ANS: Monday, July 20, 2009
type "$(date(7/20/2009), Dyyyy&apos;-&apos;MM&apos;-&apos;dd)";  // ANS: 2009-07-20
type "$(time(14:31:04), T4)";   // ANS: 02 PM
type "$(time(14:31:04), Thh&apos;.&apos;mm&apos;.&apos;ss)";  // ANS: 02.31.04
type "$(45, #5)";    // ANS: 00045
type "$(56000, ##+###)"; //ANS: 56+000
type "$(4000, ##+##M)"; //ANS: 40+00M
type "$(10000, .0,)"; //ANS: 10,000
//分数をさまざまな形式で表示
AA = 0.334;
type "AA = $(AA, # ##/##)"; //ANS: AA = 1/3
type "AA = $(AA, # #/8)"; //ANS: AA = 3/8
//さまざまな形式で度数を表示
DD = 37.34255;
type "DD = $(DD, DMS)"; //ANS: DD = 37°20&apos;33"
type "DD = $(DD, D MS)"; //ANS: DD = 37° 20&apos; 33"
type "DD = $(DD, DMSF)"; //ANS: DD = 37 20 33
type "DD = $(DD, DMF1)"; //ANS: DD = 37 20.6

C言語の形式

$() 置換の format の部分は、C言語形式のステートメントもサポートします。

オプション 符号の有無 出力 入力範囲
d, i 符号付き 整数値(小数の整数部分または整数値) -2^31 -- 2^31 -1
f, e, E, g, G 符号付き 十進数、科学表記、十進または科学表記 +/-1e290 -- +/-1e-290
o, u, x, X UNSIGNED 8進数、整数、16進数、16進数(大文字) -2^31 -- 2^32 - 1

Note:最後のカテゴリでは、負の値は2つの成分で表されます。

ここにLabTalkで使用するCコードのサンプルがいくつかあります。

double nn = -247.56;
type "Value: $(nn,%d)";   // ANS: -247
double nn = 1.23456e5;
type "Values: $(nn, %9.4f), $(nn, %9.4E), $(nn, %g)";
// ANS: 123456.0000, 1.2346E+005, 123456
double nn = 1.23456e6;
type "Values: $(nn, %9.4f), $(nn, %9.4E), $(nn, %g)";
// ANS: 123456.0000, 1.2346E+006, 1.23456e+006
double nn = 65551;
type "Values: $(nn, %o), $(nn, %u), $(nn, %X)";
// ANS: 200017, 65551, 1000F

OriginとC言語の形式の組合せ

Originは、C言語形式の指定子を使って、ES の形式の使用をサポートしています。 例えば、

xx = 1e6;
type "xx = $(xx, E%4.2f)";  // ANS: 1.00M

負の値の表示

type コマンド(およびその他)のコマンド解析は、オプションスイッチ指示子として - 記号を探します。変数Kに負の値を割り当て、typeコマンドを使ってその値を表す場合、引用符または括弧で置換表記を囲み - 記号を保護する必要があります。例えば、

K = -5;
type "$(K)"; // これは動作する
type ($(K)); // これも動作する
type $(K);   // これはtypeコマンドが -5オプションを持たないのでエラーとなる

変数の動的な名前付けと作成

置換表記$()は、代入演算子の右辺、左辺のいずれの側にあるかに関係なく、置換操作をし、値を与えます。

値2を持つ変数Aを作成します。

A = 2;

そして、この表記で値3を持つ変数A2を作成できます。

A$(A) = 3;

スクリプトウィンドウにA$(A) = または A2 = を入力して、それを確認します。


$()置換の他のサンプルについては、数値から文字列への変換をご覧下さい。

%n マクロとスクリプト引数

%nの形式の置換は、マクロ または スクリプトセクションに渡される引数で使われます。ここでnは整数1-5です(最大5つまでの引数をマクロまたはスクリプトに渡すことができます)。

次のスクリプト例は、二つの引数(%1と%2)を取り、その引数の和をダイアログボックスに出力するマクロを定義しています。

def add {type -b "(%1 + %2) = $(%1 + %2)"}

定義をしたら、次のように入力してマクロを実行できます。

add -13 27;

出力文字列は次のとおりです。

(-13 + 27) = 14

つまり、置換表記 $(%1+%2) は、14という文字表現が結果となります。