用於圖形建構器中動態列分配的 JSL 腳本我正在嘗試創建一個會話腳本,使用 JMP 的圖形生成器生成圖表。但是,由於我的資料中的列數會隨著每次資料更新的週期而變化,因此每次更新都需要手動修改圖形產生器腳本,這帶來了一個挑戰。
To address this, I am considering a method where column names are prefixed (e.g., A_, B_, C_). This would allow me to dynamically assign columns: for instance, columns prefixed with A_ could be directed to the Local Data Filter, those with B_ to the Column Switcher, and so forth.
我想了解如何在 JSL(JMP 腳本語言)中實現這種方法,因為我自己一直沒能寫出有效的腳本。您曾提到心中有一個不完整的 JSL 腳本草稿,但您的提示中並沒有包含。如果您能提供草稿,我很樂意幫助您完善它或提出解決方案。
我還遇到了以下錯誤。 →[For Each , Bad Argument( colName ), For Each/*###*/(colName, columnNames,...參數必須是一個列表。 ]
dt = Current Data Table();
A_list = {};
B_list = {};
columnNames = As List(dt << Get Column Names("String"));
For Each(colName, columnNames,<BR />
If(Contains(colName, "A_"),
Insert Into(A_list, colName)
);
If(Contains(colName, "B_"),
Insert Into(B_list, colName)
);
);
Graph Builder(
Variables(
X( :point ),
Y( :avg ),
Y( :stddev ),
Page( :category ),
Color(B_list[1])
),
Elements(
Position( 1, 1 ),
Points( X, Y( 1 ), Legend( 27 ) ),
Line( X, Y( 2 ), Y( 3 ), Color( 0 ), Legend( 29 ) )
),
Elements(
Position( 1, 2 ),
Points( X, Y( 1 ), Legend( 28 ) ),
Line( X, Y( 2 ), Y( 3 ), Color( 0 ), Legend( 31 ) )
),
Local Data Filter(
Conditional,
Add Filter(
columns( A_list ),
Display( A_list[1], N Items( 7 ), Find( Set Text( "" ) ) ),
Display( A_list[2], N Items( 7 ) ),
Display( :key, N Items( 12 ) )
)
),
Column Switcher(
:msr_dt,
B_list
)
);
自動化和腳本編寫回覆:圖表建構器中動態列分配的 JSL 腳本您是否考慮過使用列標籤來「分組」列?
這可以提供類似的功能——甚至允許“組”重疊。
例如:
Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class Families.jmp" );
dt:sex << setProperty( "Tags", {"pick"} );
dt:height << setProperty( "Tags", {"pick"} );
dt:weight << setProperty( "Tags", {"pick"} );
cols = dt << Get Tagged Columns( "pick" );
dt << Distribution( Column( Eval(cols) ));
順便說一下,這是針對每個({col},cols,body)
回覆:圖表建構器中動態列分配的 JSL 腳本
謝謝你的回复,hogi。
我之前沒有考慮到列標籤。我會再次嘗試使用列標籤修改腳本。
我完成之後會回覆你。
回覆:圖表建構器中動態列分配的 JSL 腳本根據您的使用場景,您可以使用標籤(如前面建議的那樣)、自訂列屬性、帶有前綴的列名、列組…所有這些選項都有各自的優缺點。
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
collist = dt << Get Column Names("String");
npn_cols = Filter Each({colname}, collist, Starts With(colname, "NPN"));
pnp_cols = Filter Each({colname}, collist, Starts With(colname, "PNP"));
gb = dt << Graph Builder(
Variables(X(:SITE), Y(:IVP1), Color(pnp_cols[1])),
Elements(
Position(1, 1),
Points(X, Y(1), Legend(27))
),
Elements(
Position(1, 2),
Points(X, Y(1), Legend(28)),
Line(X, Y(2), Y(3), Color(0), Legend(31))
)
);
filter_cols = npn_cols[1::2];
Insert Into(filter_cols, "SITE");
ldf = gb << Local Data Filter(
Conditional,
Add Filter(
columns(Eval(filter_cols)),
Display(filter_cols[1]),
Display(filter_cols[2]),
Display(filter_cols[3])
)
);
cw = gb << Column Switcher(pnp_cols[1], pnp_cols);
另外……這是否是社群問題和LLM提示的某種混合體(希望我們社群裡的人都是人類)?
回覆:圖表建構器中動態列分配的 JSL 腳本請原諒我用日文回覆(我認為這樣能更好地表達我的真實意圖)。
我們現在與社群分享一些向 JMP learnBot 提出的問題無法解決的案例。
最終,我利用這個社群來學習腳本編寫方法,並從有知識的人那裡獲得建議,從而提高我自己的腳本編寫技能,同時也為我周圍其他 JMP 用戶的技能發展做出貢獻。
不過,我非常抱歉,因為我擔心我可能冒犯了jthi,她總是那麼友善地回答我的問題。如果我的提問方式有任何不禮貌或不恰當的地方,如果您能指出來,我將不勝感激,以便我今後注意。
回覆:圖表建構器中動態列分配的 JSL 腳本你的貼文並沒有冒犯到我,只是讓我覺得有點奇怪,感覺像是有人在暗示我們。如果你確實用了暗示,我建議你把它單獨列出來。
LearnBot 對 JSL 的支援並不理想,因為它無法透過 JSL 指令進行學習。 Assistant 可能稍好一些,但如果您能引導 LLM(例如 Claude,最好是貴公司可以訪問的版本)理解其應執行的操作(JSL),則可能會獲得更好的結果。
回覆:圖表建構器中動態列分配的 JSL 腳本正如 Jthi 指出的那樣,我之前並沒有清楚地區分 LLM 的提示和 JMP 用戶社群的貼文。
今後,我會仔細審核內容,判斷它是否應該提交給LLM提問,還是應該發佈在JMP用戶社群。感謝您指出這些有助於溝通順暢的重要面向。
期待您一如既往的支持。
回覆:圖表建構器中動態列分配的 JSL 腳本如果您正在尋找腳本運行方法,這裡有一個更新版本,或許能幫您入門。我註解了一些修改過的部分,請注意,其中最複雜的部分涉及將列列表插入到本地資料篩選器中,這就用到了 Eval( Eval Insert() ) 函數。您可以查看「 使用 Eval Insert、Eval Expr、Parse 和 Substitute 將一個表達式插入到另一個表達式中」這篇文章,以了解不同的實作方式。
Names default to here(1);
Random reset(1);
msr_dt = New Table( "Example Data",
Add Rows( 200 ),
New Column( "A_1", Character, "Nominal", Formula( if(random uniform(1)<0.2,"",Substr( "ABC", floor(Random uniform( 4 )),1) ))),
New Column( "A_2", Character, "Nominal", Formula( if(random uniform(1)<0.2,"",Substr( "DEF", floor(Random uniform( 4 )),1) ))),
New Column( "B_1", Character, "Nominal", Formula( if(random uniform(1)<0.2,"",Substr( "GHI", floor(Random uniform( 4 )),1) ))),
New Column( "B_2", Character, "Nominal", Formula( if(random uniform(1)<0.2,"",Substr( "JKL", floor(Random uniform( 4 )),1) ))),
New Column( "point", Numeric, "Continuous", Format( "Best", 12 ), Formula( Row() ) ),
New Column( "avg", Numeric, "Continuous", Format( "Best", 12 ), Formula( Random Normal( 5 ) ) ),
New Column( "stddev", Numeric, "Continuous", Format( "Best", 12 ), Formula( Random Normal( 0.5 ) ) ),
New Column( "category", Character, "Nominal", Formula( Char( Floor( Row() / 101 ) ) ), Set Selected ),
New Column( "key", Character, "Nominal", Formula( Substr( "abcdefghijklmnopqrstufwxyz", floor(Random uniform( 27 )),1) )),
);
A_list = {};
B_list = {};
columnNames = As List(msr_dt << Get Column Names("String"));
For Each({colName},columnNames, // change here - note brackets
If(Contains(colName, "A_"),
Insert Into(A_list, colName)
);
If(Contains(colName, "B_"),
Insert Into(B_list, colName)
);
);
Eval(Eval expr(
Graph Builder(
Variables(
X( :point ),
Y( :avg ),
Y( :stddev ),
Page( :category ),
Color(B_list[1])
),
Show Control Panel( 0 ),
Elements(
Position( 1, 1 ),
Points( X, Y( 1 ), Legend( 27 ) ),
Line( X, Y( 2 ), Y( 3 ), Color( 0 ), Legend( 29 ) )
),
Elements(
Position( 1, 2 ),
Points( X, Y( 1 ), Legend( 28 ) ),
Line( X, Y( 2 ), Y( 3 ), Color( 0 ), Legend( 31 ) )
),
Local Data Filter(
Conditional,
Add Filter(
columns( Expr( A_list || {"key"} ) ), //this needs to be evaluated before the graph builder function is called
Display( A_list[1], N Items( 7 ) ), //removed the find term
Display( A_list[2], N Items( 7 ) ),
Display( :key, N Items( 12 ) )
)
),
Column Switcher(
B_list[1], // added reference to specific column here - was the data table
B_list
)
)
));
回覆:圖表建構器中動態列分配的 JSL 腳本我是JSL新手,如果這個問題之前有人問過並回答過,請見諒。
我想修改上面的 Graph Builder 腳本,使其能夠繪製 IVP 列與 NPN 列的對比圖,並用 PNP 列的顏色進行著色。附件是修改後的腳本 (Multiple Column Switcher.jsl),其中包含 3 個列切換器。我需要手動選擇所需的 IVP、NPN 和 PNP 列的組合。如果我知道 IVP、NPN 和 PNP 列是一對一的映射(例如,IVP3 與 NPN3 和 PNP3 對應),那麼如何使用單一列切換器來實現這一點呢?
回覆:圖表建構器中動態列分配的 JSL 腳本我在探索高峰會的技巧演示中介紹過這個的簡化版本( Skip、Hop 和 JMP 一分鐘速成:來自超級用戶的 JMP 小貼士 (2026-EU-30MP-2767) ,技巧「人人適用的列切換器(多列切換器)」)。
這是一種非常簡單的方法(請注意,NPN 列比其他列多,因此在這種情況下它會使用錯誤的列)。
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
collist = dt << Get Column Names("String");
npn_cols = Filter Each({colname}, collist, Starts With(colname, "NPN"));
pnp_cols = Filter Each({colname}, collist, Starts With(colname, "PNP"));
ivp_cols = Filter Each({colname}, collist, Starts With(colname, "IVP"));
gb = dt << Graph Builder(
Variables(X(:NPN1), Y(:IVP1), Color(pnp_cols[1])),
Elements(
Position(1, 1),
Points(X, Y(1), Legend(27))
),
Elements(
Position(1, 2),
Points(X, Y(1), Legend(28)),
Line(X, Y(2), Y(3), Color(0), Legend(31))
)
);
cw1 = gb << Column Switcher(npn_cols[1], npn_cols);
cw2 = gb << Column Switcher(pnp_cols[1], pnp_cols);
cw3 = gb << Column Switcher(ivp_cols[1], ivp_cols);
Eval(EvalExpr(
post = Function({previousColumn, currentColumn, switcher},
c2 = Substitute((currentColumn << get name), "NPN", "PNP");
c3 = Substitute((currentColumn << get name), "NPN", "IVP");
Expr(cw2) << Set Current(c2);
Expr(cw3) << Set Current(c3);
);
));
handler = cw1 << Make Column Switch Handler(post);
// might want to hide other column switchers
cw_obs = (Report(gb) << Top Parent) << XPath("//ColumnSwitcherContextOutlineBox");
cws = cw_obs << Get Scriptable Object;
cw_obs[2] << Visibility("Collapse");
cw_obs[3] << Visibility("Collapse");
Write();
對於這類情況,堆疊資料表和本機資料過濾器也是不錯的選擇。