您好,我遇到过将原始数据导入数据表(dt1),然后打开另一个具有规格限制(dt2)的数据表的情况。规格限值表只有 USL 和 LSL。我将一个新的计算列插入到 dt2 中,即目标规格限制(平均值(USL,LSL))。然后,我循环遍历原始数据 dt1 的所有行,如果我得到测试名称和规格限制的匹配项,则使用规格限制设置列属性(例如,col << Set Property( "Spec Limits", { LSL( myLSLx ),USL( myUSLx ),目标( 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;
,
);
这是一个简单的“堆积”评论。@tx尼尔森的公式将比您提供的公式更胖。列公式比 for 循环运行得更快。 此外,条件语句也不是必需的,因为 JMP 在任何具有空值的计算中都会返回empty()。 因此,如果任何一个或两个值都为空,则 (:USL + :LSL)/2 将为空。
这仅供参考。
您是对的,脚本指南中没有描述此消息。 JSL 语法指南中对其进行了描述。 第一本书并未完整描述 JSL 中的每个函数和消息,但第二本书应该是完整的。 这两本书旨在相互补充并一起使用。
该消息也包含在脚本索引中,并带有指向该消息的帮助的链接。 搜索“公式”将返回一个列表,其中包括 << 运行公式和 << 重新运行公式消息。
也不知道“重播”。 看起来它会让公式重新评估,无论他们是否需要。 如果您在公式中使用随机数,您可以看到差异。 对于大多数情况,我建议使用 <回复:列公式变慢:如何等到它们完成计算很好,这也有效。 重新运行公式不在 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;