用于图形构建器中动态列分配的 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();
对于这类情况,堆叠数据表和本地数据过滤器也是不错的选择。