使用列錶框變更時間序列圖中多個變數的根名稱您好,我試圖讓使用者能夠選擇標籤名稱,並建立以該標籤名稱作為根的多個變數的時間序列圖。
然而,我正在努力解決如何動態更新它。
列錶框包含標籤列表,然後要繪製的變數將具有該標籤名稱,加上擴展名,在此範例中為 .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;但圖形產生器中的變數名稱是靜態的。 我如何讓這個動態化? 我嘗試將列錶框設為圖形產生器中的表達式,但這不起作用。
列錶框和圖形產生器位於分配語句內。 我不確定這是什麼以及它的相關性如何。
預先感謝,這是完整的程式碼!
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>進階統計建模回覆:使用列錶框更改時間序列圖中多個變數的根名稱實際上,我解決了這個問題,添加了另一個 vlist 框並在 onchange( 腳本中將分佈附加到它。
感謝您的建議!
回覆:使用列錶框更改時間序列圖中多個變數的根名稱你好,非常感謝,這澄清了一些事情,我已經投資了這本書。
我最初以圖形方式建立了應用程序,我認為 Distribution 嵌套在erieline2中,但在Organize(reparent (Lineup2(ChooseET))語句中定義。
當我運行我的腳本時,它幾乎執行了我想要的所有操作,刪除了舊的發行版“onchange”,但它在儀表板/應用程式之外創建了一個新的發行版,而不是嵌套在陣容框中。
我已附上完整的腳本。 希望有任何進一步的見解,我找不到任何關於 reparent/allocate 命令的參考資料。</CODE></P></LINGO-BODY><LINGO-SUB id="lingo-sub-277091" slang="en-US" mode="NONE">回覆:使用列錶框更改時間序列圖中多個變數的根名稱</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 平台的訊息可能不適用於其他平台。 GraphBuilder 平台允許使用者透過 UI 拖放來新增和刪除變數。 因此,JSL 向 GraphBuilderBox 實作了 Add Variable() 和 Remove Variable()。</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 ) ) )
);
選項:使用容器進行分發。 您需要在顯示中為其設定一個佔位符。 然後,當變更變數時,您可以刪除該容器中的現有分佈,然後新增一個新分佈。 回想一下,我說過你的程式碼中有一些需要清理的項目。 我沒有把它們全部清理乾淨。
該程式碼有一個空容器 Lineup2。 如果您製作Report3,則嵌套在該框中。 實際上,我會將其更改為 VListBox,因為您沒有使用 LineupBox 的功能。
Lineup2 = Lineup Box();
Report3 = Platform(
DataTable1,
Distribution(
Continuous Distribution(
Column( :A04004DD ET_DELTA Ratio )
),
以下是腳本的一部分7_InteractiveDisplays.jsl寫給JMP 腳本語言的 JSL 配套應用程序,第二版。
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" )
);
我知道您可能正在完成一項有截止日期的任務。 但試試這個腳本。 它提供了我在本次討論的帖子中提到的幾個功能的示例。 它提供如何新增和刪除發行版,即第二個選項。
祝你好運!
回覆:使用列錶框更改時間序列圖中多個變數的根名稱太好了,謝謝。
我已經用第二個時間序列圖重複了該語法,效果很好。
我無法計算出在更改標籤名稱時更改分配框中的列的語法。
這應該適用於 Distribution 物件嗎?
Eval( Eval Expr( Dstr3 << Remove Variable( {Expr( Column( dt, curr_TAG || " ET_DELTA Ratio" ) )} ) ) );
我已附上完整的腳本。
再次感謝您的幫忙。 快要陷進去了!
回覆:使用列錶框更改時間序列圖中多個變數的根名稱@斯普頓,
我附上了在我的電腦上在您的桌子上運行的腳本。
您遇到的錯誤可能是您沒有使用 JSL
curr_TAG = TAG[1];
TAG 是 ListBox << 被選取的結果;傳回一個列表,您必須取得列表中的第一項。
哦,另一個問題是我產生的表使用了擴展名 ETARG。您在 cahnge ETARG to ETarg 中彈出的程式碼可能是另一個錯誤來源。
該腳本有一個註解行 show(curr_TAG) 。 取消註釋並查看日誌。
請注意,您將看到幾行被註解掉。 我在昨天生成的表中編寫了一些變數來測試它。
回覆:使用列錶框更改時間序列圖中多個變數的根名稱你好,再次感謝。 我附上了一個表,其中包含帶有一些資料的所有欄位。
一旦我有了關於如何執行此操作的明確方法,我將刪除硬編碼的語句並按照您的建議進行一些內務處理。
我彈出了您的程式碼,但收到錯誤“jsl 參數應該是訪問或評估‘Concat’中的字元”
問候
韋恩
回覆:使用列錶框更改時間序列圖中多個變數的根名稱@斯普頓
我看了你的程式碼。該腳本有第二個 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)} );
));
);
);
) ;
回覆:使用列錶框更改時間序列圖中多個變數的根名稱@斯普頓,
下面是一個帶有列錶框的應用程式的螢幕截圖,當使用者選擇一個變數時,報告就會發生變化。 在此範例中,所有圖表都是預先製作的(請參閱選項卡),並且 selesct 上的操作是更改可見選項卡。 您的選擇操作是刪除目前的「標籤」並新增標籤,我猜測這將透過使用用於刪除和新增變數到第二個 GraphBuilderBox 的訊息來完成。

如果您將應用程式從 << Run 更改為 << Edit,
您應該會看到 ApplicationBuilder UI。 列錶框 (cart_lb) 突出顯示,紅色輪廓顯示在何處新增函數/腳本,以便在做出選擇時執行 trh 操作

這是該應用程式的列錶框的腳本
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
正如該應用程式所述,我獲取了列表的索引。 選項卡與清單對齊,因此一旦知道索引,就會顯示關聯的選項卡。
不知道您是否命名了第二個 GraphBuilder 顯示,我無法幫助編寫該腳本。 我沒有嘗試您的應用程序,因為我沒有具有預期列名稱的數據表。
也許這對你來說並不新鮮。只是想給你一些線索,以防萬一。
回覆:使用列錶框更改時間序列圖中多個變數的根名稱感謝您的回覆。
我不希望用戶必須選擇多個標籤。 我希望他們從列表中選擇一項,然後應用程式顯示多個列的時間序列圖,所有列都以該標籤作為名稱的根。
因此選擇TAG ABC123,時間序列將顯示ABC123.ETARG、ABC123.UP、ABC123.LO和ABC123.PV
回覆:使用列錶框更改時間序列圖中多個變數的根名稱@斯普頓,
有多種方法可以做到這一點。 您選擇哪種方法取決於您期望 UI 執行的操作。
使用者可以在清單中選擇 1 個項目,然後使用 Control 選擇其他項目,按住 Shift 可能是一個範圍,然後刪除一些項目。 我的想法是,您是否希望報告隨著每次選擇而更新,或者添加一個按鈕,因此一旦選擇,用戶就可以按“執行”或“重新運行”或“執行”按鈕來重做分析。
關於報告 GraphBuilder,您可以在圖形產生器框中新增和刪除變數。或者您可以添加一個“排除”的本地過濾器,其“可見性”為“折疊”,以捕獲除用戶選擇之外的所有選擇。 這些可能是選項而不是 Eval Expr。當編寫 JSL Companion 2nd Edition 時,錯過了 GraphBuilderBox 的使用。
我建議您使用過濾器製作圖表並嘗試不同的選項,以了解其工作原理。
就我個人而言,除非用戶只能進行一項選擇,否則我喜歡在可以進行多項選擇的情況下使用按鈕來啟動任務。
我沒有仔細閱讀您的程式碼,但您可以使用視窗命名空間(可能是 window:GraphBuilderBox(2) )來引用顯示框或建立類似 (this<
因此,有多種選項可以實現您想要的效果,這取決於報告的當前樹結構以及您想要的 UI 行為。