リスト ボックスを使用して、時系列プロット内の複数の変数のルート名を変更しますこんにちは、ユーザーがタグ名を選択できるようにして、そのタグ名をルートとする複数の変数の時系列プロットを作成しようとしています。
ただし、それを動的に更新する方法に苦労しています。
リスト ボックスにはタグのリストが含まれており、プロットされる変数には、この例ではそのタグ名に加えて、.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' が削除されますが、ラインナップ ボックスにネストされるのではなく、ダッシュボード/アプリケーションの外部に新しいディストリビューションが作成されます。
完全なスクリプトを添付しました。 reparent/allocate コマンドに関する参照資料が見つかりません。</CODE></P></LINGO-BODY><LINGO-SUB id="lingo-sub-277091" slang="en-US">Re: リスト ボックスを使用して、時系列プロットの複数の変数のルート名を変更します</LINGO-SUB><LINGO-BODY id="lingo-body-277091" slang="en-US"><P><A href="https://community.jmp.com/t5/user/viewprofilepage/user-id/18907" target="_blank">@スパッドン</A>、</P>
<P> </P>
<P>ある JMP プラットフォームで利用できるメッセージが、他のプラットフォームでは利用できない場合があります。 GraphBuilder プラットフォームでは、UI を介してユーザーがドラッグ アンド ドロップして変数を追加および削除できます。 したがって、JSL は Add Variable() と Remove Variable() を GraphBuilderBox に実装しました。</P>
<P> </P>
<P>Distribution にはそのようなインターフェースがないため、変数を追加および削除する方法はありません。[ヘルプ] メニューの下にある [JMP スクリプト インデックス] には、プラットフォームで利用可能なメッセージのすべてではないにしても、ほとんどのメッセージが表示されます。メイン メニュー > ヘルプ > スクリプト インデックス > オブジェクト (左上隅のフィールド) > 配布。</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 を削除してから、新しいものを追加します。 コード内にクリーンアップする項目があると言ったことを思い出してください。 私はそれらすべてをきれいにしませんでした。
このコードには、空のコンテナー 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 番目の時系列プロットで構文を繰り返しましたが、問題なく動作します。
タグ名が変更されたときに配布ボックスの列を変更する構文がわかりません。
これは 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 に変更します。これがエラーの別の原因である可能性があります。
スクリプトにはコメント行 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: リスト ボックスを使用して、時系列プロットの複数の変数のルート名を変更します@スパッドン、
以下は、リスト ボックスのあるアプリケーションのスクリーンショットです。ユーザーが変数を選択すると、レポートが変更されます。 この例では、すべてのグラフが事前に作成されており (タブを参照)、selects のアクションは表示されるタブを変更することです。 選択時のアクションは、現在の「タグ」を削除して新しいタグを追加することです.2番目のGraphBuilderBoxに変数を削除および追加するためのメッセージを使用してそれが行われると推測しています.

アプリケーションを << Run から << Edit に変更すると、
ApplicationBuilder UI が表示されます。 ListBox (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 に関しては、グラフ ビルダー ボックスに変数を追加および削除できます。または、ユーザーの選択以外のすべてをキャプチャする Visibility が collapse である Exclude のローカル フィルターを追加することもできます。 これらは、Eval Expr の代わりのオプションである可能性があります。JSL Companion 2nd Edition が作成されたとき、GraphBuilderBox の使用が見落とされていました。
フィルターを使用してグラフを作成し、さまざまなオプションを試して、これがどのように機能するかを理解することをお勧めします。
個人的には、ユーザーが 1 つしか選択できない場合を除き、複数の選択が可能な場合は、タスクを開始するためのボタンが好きです。
私はあなたのコードをよく読んでいませんでしたが、window 名前空間多分 window:GraphBuilderBox(2) を使用して表示ボックスを参照したり、(this<< 親) などの関係を確立したりできます。
そのため、目的を達成するための複数のオプションがあり、レポートの現在のツリー構造と UI に必要な動作によって異なります。