为临时变量创建公式大家好,
我对 JMP 脚本编写还是新手。 我需要帮助来创建一个公式,使该值作为变量但具有自己的名称。 我的意思如下。 所以,我想创建一个公式,可以使下面的第 4 列作为分布图的变量。
就像塑料 = 0.424542
现在的问题是公式名称将相同,即 t4 = :TYPE;:MIN;。 因此,如果我想在分布图中绘制塑料的最小值,它将采用岩石的最小值,因为岩石的公式也是 t4。
那么,我怎样才能使公式使变量值变成
塑料=:类型;:最小;
纸= :类型;:最小值;
依此类推,那么它已经可以是自变量了。如果有人可以提供帮助,我真的很感激。我已经在互联网上查了几个小时了。

回复:为临时变量创建公式这是我的错误,我漏掉了一个“)”。试试这个代码
Names Default To Here( 1 );
dt = Current Data Table();
// Only one set of Spec Limits per column can be set,
// therefore split the data into separate columns
// and set the separate limits for each column
dtSplit = dt << Split( Split By( :TYPE ), Split( :NUMERIC_RESULT ), Sort by Column Property );
// Get the names of the generated columns
colList = dtSplit << get column names( string );
// Loop across the columns and create the spec limits for each column
For( i = 1, i <= N Items( colList ), i++,
Eval(
Substitute(
Expr(
__col__ << set property(
"spec limits ",
{LSL( __LSL__ ), USL( __USL__ ), show limits( 1 )}
)
),
Expr( __col__ ), Parse( "dtSplit:" || colList[i] ),
Expr( __LSL__ ),
Eval(
Parse(
"col mean(dtSplit:" || colList[i] || ")-6*col std dev(dtSplit:" || colList[i
] || ")"
)
),
Expr( __USL__ ),
Eval(
Parse(
"col mean(dtSplit:" || colList[i] || ")+6*col std dev(dtSplit:" || colList[i
] || ")"
)
)
)
)
);
// Create a literal string that contains the JSL required to
// generate the Distributions
theExpr = "Distribution(
Arrange in Rows( 1 ),";
theExpr = theExpr || Char(
Substitute(
Expr(
Continuous Distribution(
Column( __col__ ),
Horizontal Layout( 1 ),
Vertical( 0 ),
Normal Quantile Plot( 1 )
)
),
Expr( __col__ ), Parse( "dtSplit:" || colList[1] )
)
);
For( i = 2, i <= N Items( colList ), i++,
theExpr = theExpr || "," || Char(
Substitute(
Expr(
Continuous Distribution(
Column( __col__ ),
Horizontal Layout( 1 ),
Vertical( 0 ),
Normal Quantile Plot( 1 )
)
),
Expr( __col__ ), Parse( "dtSplit:" || colList[i] )
)
);
);
theExpr = theExpr || ");";
// Run the generated code
Eval( Parse( theExpr ) );回复:为临时变量创建公式嗨吉姆,
在这里,我附上了表格来运行您提供的代码,只需进行一些修改。 如果您运行此处编写的脚本,则不会自动生成分布图。
我已经检查了日志并尝试调试它出了什么问题,但似乎我找不到它为什么抱怨有错误。对我来说看起来不错。
错误如下:
输入意外结束。 也许缺少“,”或“)”。
尝试解析函数“Distribution”的参数。
第 2 行第 560 列:...正态分位数图(1));►...
回复:为临时变量创建公式我提供的代码也应该生成发行版。
您能否附上您正在运行的数据表的副本,以便我可以看到问题是什么?...如果您查看日志文件,您还应该看到问题是什么。
回复:为临时变量创建公式嗨吉姆,
是的,它适用于列中尽可能多的类型值,但在绘制分布图时,我仍然需要手动绘制它。
是否可以在计算完所有 TYPE 值的所有限制后自动绘制分布图?我尝试手动绘制图表以导出脚本,但似乎所有内容都被硬编码为我仅在此处给出的示例表中的 TYPE 值。
TYPE 值也会时常不同。 因此,我需要避免 JSL 中的硬编码行。
@tx尼尔森
回复:为临时变量创建公式我编写的代码应该使用与数据表中找到的尽可能多的 TYPE 值。如果没有,则为错误,需要更正代码。
回复:为临时变量创建公式我提供的代码应该适用于在数据表中找到的尽可能多的 TYPE 值。
回复:为临时变量创建公式嗨吉姆,
我的意思是在计算完所有限制后,它将直接绘制所有类型值的分布图以及计算的限制。 因此,我想通过使用脚本来完成此操作,但是当我在绘制所有类型分布图后尝试导出脚本时,似乎所有类型图都仅硬编码到当前表。
意味着如果我有 TYPE 列的新项目,那么它不会绘制分布图。 它只会在类型列中绘制这 4 个项目。
希望这能回答您的问题。如果您需要对此进行更多说明,请告诉我。谢谢!回复:为临时变量创建公式@mhalwi
请您解释一下“自动绘制分布图“?您是否希望 JMP 在打开新数据表时运行绘图?或者,您是否希望 JMP 能够识别某些系统上何时有新数据可用?
回复:为临时变量创建公式嗨吉姆,
多谢!你的方法也很有效。 有机会使用 JSL 自动绘制分布图,而不是手动选择绘制图表吗?回复:为临时变量创建公式你好@朱利安,
两种解决方案都效果很好!谢谢你!
关于替代方法的 1 个问题,我需要在表格拆分后手动绘制图表。 由于 TYPE 列值总是会变化,是否有任何方法可以绘制所有列的分布图?
再次感谢你的帮助!!
回复:为临时变量创建公式这是您尝试生成输出的不同方法......它利用 JMP 能够将规格限制作为列属性,并让分发平台识别它们并在平台
Names Default To Here( 1 );
dt = Current Data Table();
// Only one set of Spec Limits per column can be set,
// therefore split the data into separate columns
// and set the separate limits for each column
dtSplit = dt << Split( Split By( :TYPE ), Split( :NUMERIC_RESULT ), Sort by Column Property );
// Get the names of the generated columns
colList = dtSplit << get column names( string );
// Loop across the columns and create the spec limits for each column
For( i = 1, i <= N Items( colList ), i++,
Eval(
Substitute(
Expr(
__col__ << set property(
"spec limits ",
{LSL( __LSL__ ), USL( __USL__ ), show limits( 1 )}
)
),
Expr( __col__ ), Parse( "dtSplit:" || colList[i] ),
Expr( __LSL__ ),
Eval(
Parse(
"col mean(dtSplit:" || colList[i] || ")-6*col std dev(dtSplit:" || colList[i
] || ")"
)
),
Expr( __USL__ ),
Eval(
Parse(
"col mean(dtSplit:" || colList[i] || ")+6*col std dev(dtSplit:" || colList[i
] || ")"
)
)
)
)
);
// Create a literal string that contains the JSL required to
// generate the Distributions
theExpr = "Distribution(
Arrange in Rows( 1 ),";
theExpr = theExpr || Char(
Substitute(
Expr(
Continuous Distribution(
Column( __col__ ),
Horizontal Layout( 1 ),
Vertical( 0 ),
Normal Quantile Plot( 1 )
)
),
Expr( __col__ ), Parse( "dtSplit:" || colList[1] )
)
);
For( i = 2, i <= N Items( colList ), i++,
theExpr = theExpr || "," || Char(
Substitute(
Expr(
Continuous Distribution(
Column( __col__ ),
Horizontal Layout( 1 ),
Vertical( 0 ),
Normal Quantile Plot( 1 )
)
),
Expr( __col__ ), Parse( "dtSplit:" || colList[i] )
)
);
);
theExpr = theExpr || ";";
// Run the generated code
Eval( Parse( theExpr ) );回复:为临时变量创建公式你好@mhalwi ,
我完全明白你现在想做什么。 如果在构建汇总表后插入以下 jsl,您将拥有为每个类型级别命名的 LSL 和 USL 变量(此处附有完整脚本,LSL USL - Original method.jsl):
For Each Row(Eval(Parse(Concat("LSL_",:Type," = ",Char(lower_limit)))));
For Each Row(Eval(Parse(Concat("USL_",:Type," = ",Char(upper_limit)))));
现在,当您为每个类型调用 Distribution 并构建参考线时,请将类型名称附加到 LSL 和 USL。 例如,在“Paper”的调度中:
Dispatch(
{
"Distributions TYPE=Paper",
"NUMERIC_RESULT"},
"1",
ScaleBox,
{Min(-0.6 ), Max( 1.2 ), Inc( 0.001 ), Minor Ticks( 0 ),
Add Ref Line( USL_Paper, Solid, "Medium Dark Red", "", 2 ),
Add Ref Line( LSL_Paper, Solid, "Medium Dark Red", "", 2 )}
)
不过,这让我开始思考。您愿意采用稍微不同的方式来实现这一目标吗? 另一种方法是,如果您拆分原始表,我们可以通过 jsl 将 LSL 和 USL 设置为列属性。 然后,当您调用 Distribution() 时,可以自动绘制限制。 还附上了相应的 JSL(LSL USL - Alt method.jsl)。
这有帮助吗?
@朱利安
回复:为临时变量创建公式大家好,
你好@uday_guntupalli和@朱利安,
在这里,我附上了示例表和 jmp 脚本,以便你们可以尝试并了解我在这里想要实现的目标。 只需更改计算机中数据表的路径即可。
正如您在脚本中看到的,数据表的摘要中有一个公式(USL 和 LSL)。
因此,我现在需要做的是创建另一个公式,该公式可以采用塑料等的 USL 值,并将其指定为 Plastic_USL = 0.4 之类的值。 然后我可以使用变量 (Plastic_USL) 使用 sendToReport 函数在塑料分布图中绘制。因此,“类型”列中的其他项目列表也是如此。
我不能直接使用 USL 变量,因为如果我使用它,它只会采用计算出的最后一个 USL 值(即 ROCK)并将其绘制在所有图表(塑料、棉花、纸张、岩石)中。 那么 USL 线将仅对于 1 个图形是正确的,而对于其余图形则是错误的。
我一直在寻找一种方法来做到这一点,但无处可去,真的需要你们的帮助。 在这里非常感谢你们的帮助!
dt = Open ("C:\*\data_table.csv");
Distribution(
Stack( 1 ),
Continuous Distribution(
Column( :NUMERIC_RESULT ),
Horizontal Layout( 1 ),
Vertical( 0 ),
Count Axis( 1 ),
Normal Quantile Plot( 1 )
),
By( :TYPE );
);
Summary(
Group(:TYPE ),
Mean( :NUMERIC_RESULT ),
Std Dev( :NUMERIC_RESULT )
);
New Column( "lower_limit",
Numeric,
Continuous,
Format( "Best", 8 ),
Formula(
LSL = :Name( "Mean(NUMERIC_RESULT)" ) - 6 *:Name( "Std Dev(NUMERIC_RESULT)" )
),
);
New Column( "upper_limit",
Numeric,
Continuous,
Format( "Best", 8 ),
Formula(
USL = :Name( "Mean(NUMERIC_RESULT)" ) + 6 *:Name( "Std Dev(NUMERIC_RESULT)" )
),
);
wait (1);
dr = Fit Group (
Distribution(
Stack( 1 ),
Continuous Distribution(
Column( :NUMERIC_RESULT ),
Horizontal Layout( 1 ),
Vertical( 0 ),
Count Axis( 1 ),
Normal Quantile Plot( 1 )
),
By( :TYPE )
);
SendToReport(Dispatch({"Distributions TYPE=Cotton","NUMERIC_RESULT"},"1",ScaleBox,
{Min( LSL - 1 ), Max( USL + 1 ), Inc( 0.005 ), Minor Ticks( 1 ),
Add Ref Line( LSL, Solid, "Medium Dark Red", "", 2 ),
Add Ref Line( USL, Solid, "Medium Dark Red", "", 2 )}
)
);
SendToReport(
Dispatch(
{
"Distributions TYPE=Paper",
"NUMERIC_RESULT"},
"1",
ScaleBox,
{Min(-0.6 ), Max( 1.2 ), Inc( 0.001 ), Minor Ticks( 0 ),
Add Ref Line( USL, Solid, "Medium Dark Red", "", 2 ),
Add Ref Line( LSL, Solid, "Medium Dark Red", "", 2 )}
)
);
SendToReport(
Dispatch(
{
"Distributions TYPE=Plastic",
"NUMERIC_RESULT"},
"1",
ScaleBox,
{Min( 0.1 ), Max( 0.4 ), Inc( 0.005 ), Minor Ticks( 0 ),
Add Ref Line( USL, Solid, "Medium Dark Red", "", 2 ),
Add Ref Line( LSL, Solid, "Medium Dark Red", "", 2 )}
)
);
SendToReport(
Dispatch(
{
"Distributions TYPE=Rock",
"NUMERIC_RESULT"},
"1",
ScaleBox,
{Min( 0.01 ), Max( 3.5 ), Inc( 0.01 ), Minor Ticks( 0 ),
Add Ref Line( USL, Solid, "Medium Dark Red", "", 2 ),
Add Ref Line( LSL, Solid, "Medium Dark Red", "", 2 )}
)
);
)<<REPORT></REPORT>
回复:为临时变量创建公式你好@mhalwi ,
我不确定你到底在问什么,但我有两个猜测,所以希望其中一个是正确的!
第一个猜测:您是否正在尝试构建一个公式,该公式将返回一个类型为文本的列,然后是等号,然后是 min 列中的值? 公式列中的以下公式将实现此目的:
Concat(:Type," = ",Char(:Min))
并返回一个像这样的表:
我附上了示例表,以防有帮助。
第二个猜测:您想要将以 type 列中的单元格命名的新变量设置为 min 列中的值。 或者换句话说,您想要评估上表第 4 列中的文本。 如果这就是您所追求的(并且您已经制作了此表),您可以运行以下 jsl:
For Each Row(Eval(Parse(:Column 4)));
但是,仅仅为了评估而创建该专栏可能并不是最节俭的方法。 如果这是您想要执行的操作,则以下命令将设置这些变量而不创建该公式列:
For Each Row(Eval(Parse(Concat(:Type," = ",Char(:Min)))))
我希望这两个答案之一有帮助!
@朱利安
回复:为临时变量创建公式@mhalwi ,
我不确定我是否理解你想要做什么。 不过,我会尝试根据我所理解的进行解释。
下面显示的是我对你想要做的事情的解释。 本质上绘制数据的分布,以便能够看到您的类型的最小值。 我认为下面所示的图表可以实现这一点。
如果这不是您想要的,您能否提供一些您正在尝试做的事情的屏幕截图(在 Excel 中完成),以便社区可以帮助您实现您想要实现的目标?
