您好,我遇到过将原始数据导入数据表 (dt1),然后打开另一个具有规格限制 (dt2) 的数据表的情况。规格限表只有 USL 和 LSL。我将一个新的计算列插入到 dt2 中,它是目标规格限制 (mean(USL,LSL))。然后我遍历原始数据 dt1 的所有行,如果我得到测试名称和规格限制的匹配项,则使用规格限制设置 colum 属性(例如,col << Set Property( "Spec Limits", { LSL( myLSLx ), USL( myUSLx ), Target( mytargetx ), );)... 然后关闭 spec 文件 dt2,不保存。
我认为我遇到的问题是计算列 (dt2:_Target) 不够快,在创建新的计算列 ("_Target"...) 之后,我在尝试读取它们时得到所有空值。如果我保持 dt2 文件打开,我会在计算列“_Target”中看到正确的值。我玩过 dt2<< Begin data Update;这也不起作用,但也许我把它放在脚本中的错误位置?我唯一的解决方法是不对新列使用公式,而是在脚本中计算目标值并通过索引所有行将其放入规范文件中。
我的问题的根源是,在尝试读取行/列中的特定值之前,我可以等待所有列完成计算吗?
不起作用
例如,
New Column( "_Target",Numeric,"Continuous",Format( "Best", 12 ),Formula(If( Is Missing( :_LSL ) | Is Missing( :_USL ),
Empty(),
Mean( :_LSL, :_USL )
)
解决方法
例如,
dt2 = current data table();
New Column( "_Target", Numeric, "Continuous");
dt2_rows = nrows();
for (i=1, i<=dt2_rows, i++,
if(or(!is missing(dt2:_LSL[i]),!is missing(dt2:_USL[i])),
dt2:_Target[i] = ((dt2:_LSL[i]) + (d2t:_USL[i])) / 2;
,
);
这是一个简单的“堆积”评论。@txnelson的公式会比你提供的更胖。列公式比 for 循环运行得更快。 此外,不需要条件语句,因为 JMP 在任何具有空值的计算中都会返回 empty()。 因此,如果任何一个或两个值都为空,则 (:USL + :LSL)/2 将为空。
这只是一个仅供参考。
脚本指南中没有描述此消息,这是正确的。 JSL 语法指南中对此进行了描述。 第一本书没有完整描述 JSL 中的每个函数和消息,但第二本书应该是完整的。 这两本书互为补充,一起使用。
该消息也包含在脚本索引中,并带有指向它的帮助的链接。 搜索“公式”将返回一个列表,其中包括 << Run Formulas 和 << Rerun Formulas 消息。
也不知道“重新运行”。 看起来它使公式重新评估,无论他们是否需要。 如果您在公式中使用随机数,您可以看到差异。 对于大多数情况,我建议使用 <回复:列公式变慢:如何等到它们完成计算不错,这也行。 重新运行公式不在 JMP V13 脚本指南中,而运行公式在。 在这种情况下两者都有效。回复:列公式变慢:如何等到它们完成计算惊人的! 有用!回复:列公式变慢:如何等到它们完成计算
下面是一个应该适合您的简单修改。首先,去掉 If() 子句会加快处理速度,其次,
dt << 重新运行公式;
将强制 JMP 在继续之前完成对公式的处理
dt = Current Data Table();
dt << New Column( "_Target",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula( (:LSL + :USL) / 2 )
);
dt << rerun formulas;