リスト ボックスを使用して、時系列プロット内の複数の変数のルート名を変更しますこんにちは。ユーザーがタグ名を選択し、そのタグ名をルートとする複数の変数の時系列プロットを作成できるようにしようとしています。
ただし、それを動的に更新する方法に苦労しています。
リスト ボックスにはタグのリストが含まれており、プロットされる変数にはそのタグ名に加えて、この例では .PV、.ETARG などの拡張子が付けられます。

次のステートメントを解析して変数名を生成します
vars = {};
str = "Variables(
X( :Time ),
Y( :" || TAG || ".ETARG, Position (1) ),
Y( :" || TAG || ".LO, Position( 1 ) ),
Y( :" || TAG || ".PV, Position( 1 ) ),
Y( :" || TAG || ".UP, Position( 1 ) )
)";
vars = parse(str);この場合、グラフ ビルダーは、プロットするための固定タグを持たせる代わりに、これらを参照します。
Eval Expr(
DataTable1<<GRAPH builder=""></GRAPH>
ユーザーが変数のルート名を選択できるリストボックスがあります。
ChooseET = List Box( ( ET_TAG_LIST ),
maxSelected( 1 ),
onChange(
TAG = ChooseET << Get Selected;ただし、グラフ ビルダーの変数名は静的です。 これを動的にするにはどうすればよいですか? グラフビルダー内でリストボックスを式にしようとしましたが、うまくいきません。
リスト ボックスとグラフ ビルダーは、allocate ステートメント内にあります。 これが何なのか、どの程度関連性があるのかわかりません。
事前に感謝します。完全なコードは次のとおりです。
JMP App(
Set Name( "Application" ),
Set Description(
"An empty workspace for creating custom applications with one or more windows and scripts"
),
Auto Launch( 1 ),
Snap To Grid( 1 ),
Show Grid( 1 ),
Show Properties( 1 ),
Show Sources( 1 ),
Group By Category( 1 ),
Dashboard Mode( 0 ),
Parameters,
Tables(
DataTable1 = GuiTable(
Set Path( "" ),
Set Label( "Output Table" ),
Set Location( "Current Data Table" ),
Set Invisible( 0 )
)
),
Script(JSL Quote(// This script is executed when the application is run.
// Named objects have been created for the application modules
// (for example, "Module1") and the pre-defined object
// "thisApplication" refers to the application object itself.
// Variables and functions declared here are scoped to the
// Application namespace.
dt = Current data table();
ETSelected = "A04004DD";
TAG = ETSelected;;
vars = {};
str = "Variables(
X( :Time ),
Y( :" || TAG || ".ETARG, Position (1) ),
Y( :" || TAG || ".LO, Position( 1 ) ),
Y( :" || TAG || ".PV, Position( 1 ) ),
Y( :" || TAG || ".UP, Position( 1 ) )
)";
vars = parse(str);
show(vars);
PDChartproperties = "
{Legend Model(
3,
Properties( 0, {Line Color( 4 )}, Item ID( \!"" || TAG ||".ETarg\!", 1 ) ),
Properties( 1, {Line Color( 19 ), Marker Size( 1 )}, Item ID( \!"" || TAG ||".LO\!", 1 ) ),
Properties( 2, {Line Color( 53 )}, Item ID( \!"" || TAG ||".PV\!", 1 ) ),
Properties( 3, {Line Color( 19 ), Marker Size( 1 )},Item ID( \!"" || TAG ||".UP\!", 1 )
)
)}
";
props = parse(PDChartproperties);
show(props);
dt = Current Data Table();
ET_LIST = {};
ET_TAG_List = {};
For( i = N Col( dt ), i >= 1, i--,
ET_col = Column (dt, i) << Get Name ();
If(
(Col N Missing( Column( i ) ) / N Row()) != 1 &
Contains (ET_col, "ETarg"),
Insert Into(ET_LIST, ET_col);
);
);
Show (ET_LIST);
n = N Items( ET_LIST );
For( i = 1, i <= n, i++,
ETARG = ET_LIST[i] ;
NFull = Length(ETARG) ;
ETTAG = Left(ETARG,(NFull-6)) ;
Insert Into(ET_TAG_List, ETTAG);
);
Show(ET_TAG_List);
) ),
Allocate(
Module1 = Plan(
PreAllocate,
Script(JSL Quote(// This script is executed when a new module instance is
// created. The pre-defined object "thisModuleInstance" refers
// to the instance object, but other objects such as boxes and
// scripts have not yet been created. Variables declared here are
// scoped to the ModuleInstance namespace.
// This special function will receive parameters passed to CreateInstance()
OnModuleLoad({},
);
thisModuleInstance << Create Objects;
// After this point your module instance objects have been created
// and can be referred to by name (for example, "Button1").
ColList1Select=Function({this},{selectedIndices},
// This function is called when the List Box selection changes
selectedIndices = this << Get Selected Indices;
);
) ),
Allocate(
DataFilterContext1 = Data Filter Context Box();
Lineup2 = Lineup Box();
Report3 = Platform(
DataTable1,
Distribution(
Continuous Distribution(
Column( :A04004DD ET_DELTA Ratio )
),
SendToReport(
Dispatch(
{"A04004DD ET_DELTA Ratio"},
"1",
ScaleBox,
{Min( -5 ), Max( 5 ), Inc( 0.1 ), Minor Ticks( 0 )}
),
Dispatch(
{"A04004DD ET_DELTA Ratio"},
"Quantiles",
OutlineBox,
{Close( 1 )}
),
Dispatch(
{"A04004DD ET_DELTA Ratio"},
"Summary Statistics",
OutlineBox,
{Close( 1 )}
)
)
)
);
Report1 = Platform(
DataTable1,
Graph builder(
Size( 430, 370 ),
Show Control Panel( 0 ),
Fit to Window( "Maintain Aspect Ratio" ),
Variables(
X( :Time ),
Y( :ZZ ET Metric ),
Y( :A04004DD ET_Pass, Position( 1 ) ),
Y( :A04004DD ET_Pass Ave, Position( 1 ) )
),
Elements( Points( X, Y( 1 ), Y( 2 ), Y( 3 ), Legend( 3 ) ) ),
SendToReport(
Dispatch(
{},
"Time",
ScaleBox,
{Min( 3675484152 ), Max( 3676021620 ),
Interval( "Day" ), Inc( 5 ), Minor Ticks( 0 )}
)
)
)
);
ChooseET = List Box( ( ET_TAG_LIST ),
maxSelected( 1 ),
onChange(
TAG = ChooseET << Get Selected;
If( N Items( TAG ) != 0,
Show( TAG );
);
) );
DataFilter1 = DataTable1 << Data Filter(
Local,
Add Filter(
columns( :Day ),
Display( :Day, Size( 0, 0 ), Height( 0 ) )
)
);
Report2 = Platform(
DataTable1,
gb = Eval(
Eval Expr(
DataTable1<<GRAPH builder=""></GRAPH>高度な統計モデリングRe: リスト ボックスを使用して時系列プロット内の複数の変数のルート名を変更する実際、私はこれを解決し、別のvlistボックスを追加し、onchange(スクリプト内でそれにディストリビューションを追加しました。
アドバイスをありがとう!
Re: リスト ボックスを使用して時系列プロット内の複数の変数のルート名を変更するこんにちは、ありがとう。これでいくつかのことが明確になり、私はこの本に投資しました。
最初にアプリケーションをグラフィカルに構築しました。Distribution は lineup2 にネストされていると思いますが、Organize(reparent (Lineup2(ChooseET)) ステートメントで定義されています。
スクリプトを実行すると、必要なことはほぼすべて実行され、古いディストリビューション「onchange」が削除されますが、[ラインナップ]ボックスにネストされるのではなく、ダッシュボード/アプリケーションの外側に新しいディストリビューションが作成されます。
完全なスクリプトを添付しました。 再親化/割り当てコマンドに関する参考資料が見つかりません。さらなる洞察をいただければ幸いです。</CODE></P></LINGO-BODY><LINGO-SUB id="lingo-sub-277091" slang="en-US" mode="NONE">Re: リスト ボックスを使用して時系列プロット内の複数の変数のルート名を変更する</LINGO-SUB><LINGO-BODY id="lingo-body-277091" slang="en-US" mode="NONE"><P><A href="https://community.jmp.com/t5/user/viewprofilepage/user-id/18907" target="_blank">@スパッドン</A>、</P>
<P> </P>
<P>ある JMP プラットフォームで利用できるメッセージは、他の JMP プラットフォームでは利用できない場合があります。 GraphBuilder プラットフォームを使用すると、ユーザーは UI を介してドラッグ アンド ドロップして変数を追加および削除できます。 したがって、JSL は GraphBuilderBox に Add Variable() と Remove Variable() を実装しました。</P>
<P> </P>
<P>ディストリビューションにはそのようなインターフェイスがないため、変数を追加および削除する方法はありません。[ヘルプ] メニューの下にある JMP Scripting Index には、プラットフォームで利用可能なメッセージのすべてではないにしても、ほとんどが表示されます。メイン メニュー > ヘルプ > スクリプト インデックス > オブジェクト (左上隅のフィールド) > 配布。</P>
<P> </P>
<P>通常、JSL を使用して何かを実行するには複数の方法があることがわかります。いくつかのオプションは次のとおりです。</P>
<P><STRONG>オプション</STRONG>: ディストリビューション プラットフォームをディストリビューションを作成する GraphBuilder に変更します。 同じオプションはなく、見た目も同じではありません。 ただし、変数を追加および削除することはできます</P>
<PRE><CODE class=" language-jsl">gbdist =Graph Builder(
Size( 534, 456 ),
Show Control Panel( 0 ),
Variables( Y( :A04004DD ET_DELTA Ratio ) ),
Elements( Histogram( Y, Legend( 3 ), Counts( 1 ) ) )
);
オプション: ディストリビューションにはコンテナを使用します。 ディスプレイにそのためのプレースホルダーが必要です。 次に、変数を変更するときに、そのコンテナ内の既存の Distribution を削除してから、新しい Distribution を追加します。 コード内にクリーンアップする項目があると述べたことを思い出してください。 全部は掃除しませんでした。
コードには空のコンテナ Lineup2 があります。 Report3 を作成すると、そのボックス内にネストされます。 実際には、LineupBox の機能を使用していないため、これを VListBox に変更します。
Lineup2 = Lineup Box();
Report3 = Platform(
DataTable1,
Distribution(
Continuous Distribution(
Column( :A04004DD ET_DELTA Ratio )
),
以下はスクリプトの一部です7_InteractiveDisplays.jslのために書かれたJMP スクリプト言語の JSL コンパニオン アプリケーション、第 2 版。
clear globals();
orig_dt = Open( "$SAMPLE_DATA/Fitness.jmp" );
cnt = 0; Chosen Columns={}; //initiate values
//----Refresh display script---------------------------
refresh_script = Expr(
Try(dist_vlist << delete);
If( (cnt > 0 & N Items( Chosen Columns ) >= 1),
show(Chosen Columns);
dist_vlist = VListBox(
orig_dist = orig_dt << Distribution( Column( Eval( Chosen Columns ) ), invisible )
); //end VListBox
result_ob << append( dist_vlist );
) //end If
); //end Expr
//----Action to take for Add-----------------------------
add_script = Expr(
cnt = cnt + 1;
listocols << Append( selcol << Get Selected );
);
//----Action to take for Remove -----------------------------
remove_script= Expr(
cnt = cnt + 1;
listocols << Remove Selected;
);
//_______________________________________________________________________________
//-----Dialog Window layout---------------------------------
dist_win = New Window( "Create Distributions",
H List Box(
selcol = Col List Box( All, width( 100 ), nlines( 6 ) ),
Lineup Box( N Col( 1 ), Spacing( 3 ),
Button Box( "Add Column >>", add_script ),
Button Box( "<< Remove Column", remove_script )
),
// listocols is a Col List Box
listocols = Col List Box( width( 100 ), nlines( 6 ),
OnChange( Chosen Columns = listocols << Get Items;
refresh_script;)
) //end listocols
), //end HListBox
Text Box( " " ),
result_ob = Outline Box( "Current Selections" )
);
あなたはおそらく期限のあるタスクに取り組んでいると思います。 しかし、このスクリプトを試してみてください。 このディスカッションへの投稿で参照したいくつかの機能の例を示します。 ディストリビューションの追加と削除、2 番目のオプションの方法を説明します。
幸運を!
Re: リスト ボックスを使用して時系列プロット内の複数の変数のルート名を変更するすごいですね、ありがとう。
2 回目の時系列プロットで構文を繰り返しましたが、正常に動作しました。
TAG 名が変更されたときに配布ボックスの列を変更する構文がわかりません。
これは Distribution オブジェクトで機能する必要がありますか?
Eval( Eval Expr( Dstr3 << Remove Variable( {Expr( Column( dt, curr_TAG || " ET_DELTA Ratio" ) )} ) ) );
完全なスクリプトを添付しました。
ご助力に改めて感謝いたします。 ほぼ沈み込んでいます!
Re: リスト ボックスを使用して時系列プロット内の複数の変数のルート名を変更する@スパッドン、
私の PC 上のテーブルで実行されるスクリプトを添付しました。
発生している可能性があるエラーは、JSL を使用していないことです。
curr_TAG = TAG[1];
TAG は ListBox << get selected ; の結果です。リストを返す場合は、リストの最初の項目を取得する必要があります。
ああ、もう 1 つの問題は、拡張子 ETARG を使用して生成されたテーブルです。ポップインしたコードが ETARG を ETarg に変換します。これがエラーのもう 1 つの原因である可能性があります。
スクリプトには show(curr_TAG) というコメント行があります。 コメントを外してログを見てください。
いくつかの行がコメントアウトされていることに注意してください。 昨日テストするために生成したテーブルにいくつかの変数を作成しました。
Re: リスト ボックスを使用して時系列プロット内の複数の変数のルート名を変更するこんにちは、またよろしくお願いします。 いくつかのデータを含むすべての列を含むテーブルを添付しました。
これを行う方法が明確になったら、ハードコードされたステートメントを削除し、アドバイスに従っていくつかのハウスキーピングを実行します。
コードを入力しましたが、「jsl 引数は 'Concat' のアクセスまたは評価の文字である必要があります」というエラーが発生しました。
よろしく
ウェイン
Re: リスト ボックスを使用して時系列プロット内の複数の変数のルート名を変更する@スパッドン
あなたのコードを見ました。スクリプトには 2 番目の GraphBuilder へのハンドルがあります。使用するデータ テーブルがなかったため、いくつかの変更を加える必要がありました。
コードにはいくつかのハードコーディングされた要素があるため、削除することをお勧めします。
- レポートに送信 X 軸の日付範囲
- レポート凡例項目に送信 (またはそれらを保守する必要があります)
開始タグがハードコードされているようです。そこで、開始時の curr_TAG をその値に設定しました。以下に、削除する JSL を示し、GraphBuilderBox に変数を追加します。 gb の周りにコンテナーを配置し、変更時に gb を削除してから新しい gb を追加する方がエレガントかもしれないと思います。
いくつかコメントがありますが、データ テーブルには常に PV、LO、UP 列が含まれると確信していますか?これは確認する必要がありますか?
前述したように、同じ結果を達成するには複数の方法があります。幸運を!
curr_TAG = "A04004DD";
ChooseET = List Box( ( ET_TAG_LIST ),
maxSelected( 1 ),
onChange(
TAG = ChooseET << Get Selected;
If( N Items( TAG ) != 0,
Show( TAG );
gbb2 = Report(gb)[GraphBuilderBox(1)];
Eval( EvalExpr(gbb2 << Remove Variable({Expr(column(dt,curr_TAG||".ETARG")), Role("Y"), Position(1)} );
gbb2 << Remove Variable({Expr(column(dt,curr_TAG||".LO")), Role("Y"), Position(1)} );
gbb2 << Remove Variable({Expr(column(dt,curr_TAG||".PV")), Role("Y"), Position(1)} );
gbb2 << Remove Variable({Expr(column(dt,curr_TAG||".UP")), Role("Y"), Position(1)} );
));
curr_TAG = TAG[1];
//show(curr_TAG);
wait(0);
Eval( EvalExpr(gbb2 << Add Variable({Expr(column(dt,curr_TAG||".ETARG")), Role("Y"), Position(1)} );
gbb2 << Add Variable({Expr(column(dt,curr_TAG||".LO")), Role("Y"), Position(1)} );
gbb2 << Add Variable({Expr(column(dt,curr_TAG||".PV")), Role("Y"), Position(1)} );
gbb2 << Add Variable({Expr(column(dt,curr_TAG||".UP")), Role("Y"), Position(1)} );
));
);
);
) ;
Re: リスト ボックスを使用して時系列プロット内の複数の変数のルート名を変更する@スパッドン、
以下は、リスト ボックスを備えたアプリケーションのスクリーンショットです。ユーザーが変数を選択すると、レポートが変更されます。 この例では、すべてのグラフが事前に作成されており (タブを参照)、select でのアクションは、表示されるタブを変更することです。 選択時のアクションは、現在の「タグ」を削除して新しいタグを追加することです。2番目のGraphBuilderBoxに変数を削除および追加するためのメッセージを使用してそれが行われると推測しています。

アプリケーションを << Run から << Edit に変更すると、
ApplicationBuilder UI が表示されるはずです。 リストボックス (cart_lb) が強調表示され、赤い枠線で、選択時に実行される trh アクションの関数/スクリプトを追加する場所が示されます。

このアプリケーションのListBoxのスクリプトは次のとおりです。
Local({idx, nme, tList},
tlist = (cart_lb << get selected);
if(nitems(tlist) >0,
nme = tlist[1];
//show(nme);
idx = var_tabs << index of tab(nme);
var_tabs << set selected(idx);
//show(idx);
); //end if
); //end Local
このアプリケーションで述べたように、リストのインデックスを取得します。 タブはリストに合わせて配置されるため、インデックスが判明すると、関連するタブが表示されます。
2 番目の GraphBuilder 表示に名前を付けたかどうかがわからないため、スクリプトを手伝うことはできません。 期待される列名を持つデータテーブルがないため、アプリケーションを試していません。
おそらくこれはあなたにとって新しいことではないでしょう。念のため、いくつかの手がかりを提供しようとしています。
Re: リスト ボックスを使用して時系列プロット内の複数の変数のルート名を変更するご返信ありがとうございます。
ユーザーに複数のタグを選択させる必要はありません。 リストから 1 つの項目を選択すると、アプリケーションは複数の列の時系列プロットを表示します。そのタグはすべて名前のルートとして付けられます。
したがって、TAG ABC123 を選択すると、時系列には ABC123.ETARG、ABC123.UP、ABC123.LO、ABC123.PV が表示されます。
Re: リスト ボックスを使用して時系列プロット内の複数の変数のルート名を変更する@スパッドン、
これを行うには複数の方法があります。 どの方法を選択するかは、UI に期待するアクションによって異なります。
ユーザーはリスト内の 1 つの項目を選択し、コントロールを使用して他の項目を選択し、Shift キーを押したまま範囲を指定して、いくつかを削除できます。 私の質問は、選択するたびにレポートを更新するか、それともボタンを追加して、選択したら [実行] ボタン、[再実行] ボタン、または [実行] ボタンを押して分析をやり直すかです。
レポート GraphBuilder に関しては、グラフ ビルダー ボックスに変数を追加および削除できます。または、ユーザーの選択以外のすべてをキャプチャする、可視性が折りたたみである除外のローカル フィルターを追加することもできます。 これらは Eval Expr の代わりのオプションである可能性があります。JSL Companion 2nd Edition が作成されたとき、GraphBuilderBox の使用は省略されていました。
これがどのように機能するかを理解するために、フィルターを使用してグラフを作成し、さまざまなオプションを試してみることをお勧めします。
個人的には、ユーザーが 1 つしか選択できない場合を除き、複数の選択が可能な場合はタスクを開始するボタンが好きです。
コードをあまり詳しく読んでいませんが、おそらく window:GraphBuilderBox(2) のようなウィンドウ名前空間を使用して表示ボックスを参照したり、(this<
したがって、目的を達成するには複数のオプションがあり、それはレポートの現在のツリー構造と UI に必要な動作によって異なります。