我目前有一个脚本,它可以为各种变量创建控制和过程能力图表,将其放入日志中,然后将日志保存为 pdf。问题是,我的脚本长达 5000 行,运行速度比冰箱里的糖蜜还慢。所以我认为为我构建的每种图表类型定义一个函数并以这种方式将它们拼接在一起更有意义。我成功地为控制图创建了函数,但我无法让过程能力图工作。
下面是一个脚本,它使用机场样本数据(附件)来创建一个类似于我想要制作的图表:
Process Capability(
Process Variables( :Flight ), // select column for data
Spec Limits( :Flight( LSL( 0 ), /*Target( 30 ),*/ USL( 20 ) ) ), //Spec limits, dont need target
Individual Detail Reports( 1 ),
Capability Box Plots( 0 ),
Goal Plot( 0 ),
Capability Index Plot( 0 ),
Process Performance Plot( 0 ), // hide unnecessary info
{:Flight << Process Capability Analysis(
Overall Sigma Capability( 1 ),
Within Sigma Capability( 1 ),
Histogram( 1, Show Target( 1 ), Show Within Sigma Density( 1 ), Show Overall Sigma Density( 1 ) )
)},
);我想定义一个以列名作为输入的函数。以下是我目前所拥有的:
capability_chart = function({variable, low, up},
Process Capability(
Process Variables( eval(variable) ), // select column for data
Spec Limits( eval(variable)(LSL( low ), /*Target( 30 ),*/ USL( up )) ),
Individual Detail Reports( 1 ),
Capability Box Plots( 0 ),
Goal Plot( 0 ),
Capability Index Plot( 0 ),
Process Performance Plot( 0 ), // hide unnecessary info
{column(dt, element) << Process Capability Analysis(
Overall Sigma Capability( 1 ),
Within Sigma Capability( 1 ),
Histogram( 1, Show Target( 1 ), Show Within Sigma Density( 1 ), Show Overall Sigma Density( 1 ) )
)}
)
);
capability_chart("Flight", 0, 10)当我运行此程序时,会弹出一个窗口提示我输入规格限值。我希望我的脚本能够自动填充规格限值。我还尝试在规格限值行中使用 column() 和 ascolumn() 代替 eval(),但它们的作用相同。理想情况下,我不必创建规格表或将规格限值添加为列属性,但如果没有其他方法,我可以这样做。我也不想循环遍历所有列并创建一堆过程能力图表,因为报告的现有格式很难更改。任何帮助都值得感激。
如果你只需要一次处理一列,我会在这种情况下使用分发平台
Names Default To Here(1);
capability_chart = function({dt, colname, lowlimit, highlimit}, {Default Local},
dist = dt << Distribution(
Continuous Distribution(
Column(:Flight),
Quantiles(0),
Summary Statistics(0),
Histogram(0),
Vertical(0),
Outlier Box Plot(0),
Process Capability(LSL(lowlimit), Target(.), USL(highlimit))
)
);
return(dist);
);
dt = Open("$SAMPLE_DATA/Quality Control/Airport.jmp");
pc = capability_chart(dt, "Flight", 0, 10);
由于大纲框的存在,您最终会得到略有不同的报告,但如果需要,可以将其“隐藏”(或者只将您感兴趣的大纲框放入报告中)

以下是使 JSL 表达式发挥作用的一些技巧:
JMP 中的表达式处理:Tipps 和 Trapdoors
提示:
- 大多数平台除了接受列名 (=reference, :Flight ) 之外,还接受列名 (=string, "Flight" ):)
所以我们需要的唯一技巧是:用列名(字符串)替换变量。
问题:大多数情况下,Jmp 在调用函数之前不会评估参数。因此,如果将Eval()放在函数参数周围,它将无助于对其进行评估。
-> 将所有内容包装在Eval(Eval Expr(())中,并用Expr()替换Eval()
...告诉 Jmp 先对它们进行评估。
capability_chart = function({variable, low, up},
Eval Expr(Process Capability(
Process Variables( Expr(variable), // select column for data
Spec Limits( Expr(variable)(LSL( low ), /*Target( 30 ),*/ USL( up )) ),
Individual Detail Reports( 1 ),
Capability Box Plots( 0 ),
Goal Plot( 0 ),
Capability Index Plot( 0 ),
Process Performance Plot( 0 ) // hide unnecessary info
))
));
capability_chart("Flight", 0, 10)
但Spec Limits("Flight"(LSL(低),目标(。),USL(上))不起作用,它被转换为
Spec Limits( :Flight << {LSL( low ), Target( .), USL( up )} )
因此,让我们尝试使用Name Expr(As column(列名)) 的技巧:
Spec Limits(Expr(Name Expr(As column(variable)))(LSL( low ), Target( .), USL( up )) ),
...我们再次得到:
Spec Limits( :Flight << {LSL( low ), Target( .), USL( up )} )哇哦!...还有啊!
因此,让我们使用 B 计划:它总是有效的:使用Eval(Substitute())
原思路:结合Name Expr(As column(column_name))作为替换表达式
...但几乎令人惊讶的是,它甚至可以使用裸字符串(!):
capability_chart = function({variable, low, up},
Eval(Substitute(Expr(Process Capability(
Process Variables( _var_ ), // select column for data
Spec Limits( _var_(LSL( low ), /*Target( 30 ),*/ USL( up )) ),
Individual Detail Reports( 1 ),
Capability Box Plots( 0 ),
Goal Plot( 0 ),
Capability Index Plot( 0 ),
Process Performance Plot( 0 ) // hide unnecessary info
)),Expr(_var_), variable
)));
capability_chart("Flight", 0, 10)