除非事后运行,否则部分脚本不会执行我有一部分脚本用于对表中的列进行重新编码,以将值从“X”更改为 0。 当与我的主脚本分开运行时,我得到了这部分代码的工作(谢谢 JMP 讨论论坛!!)。 但是,当我将其插入到更大的脚本中时(即使在最后)JMP 不会执行我的命令。 当代码被放置在我的脚本中间时,它之后的所有内容都没有运行......所以我将它移动到主脚本的底部,但它仍然没有执行。 每次我突出显示这部分并在事后运行它时,它都完全符合我的要求。
我尝试实现 wait(0);,从 i 更改为 k,并在 For Each Row 周围使用 Try 语句,但没有成功。 我真的很摸不着头脑,为什么它只能在事后才起作用。 建议?
//Recode columns in Yield Table to give "0" instead of X's
wait(0);
yieldcols = Yields << get column names;
For Each Row( For( k = 1, k <= N Items( yieldcols ), k++,
If( Is Missing( As Column( yieldcols[k] )[] ),
As Column( yieldcols[k] )[] = 0 ) ) );
高级统计建模自动化和脚本编写数据混合和清理实验设计大规模定制回复:除非事后运行,否则部分脚本不会执行你好,
我不确定为什么我提供的代码不适合您。 您可以尝试以下操作:
1)在新窗口中单独运行我提供的原始代码。 有效吗? 如果没有,您使用的是哪个版本的 JMP? 例如,直接数据表索引已在几个版本之前添加,但在 JMP 12 中并未添加。
2)假设1)上述有效,下一步是将所有“dt”实例替换为“yields”,在新窗口中单独运行新代码。 这对我有用,如果 1) 对你有用,我希望它也对你有用。
Names Default To Here(1);
//create a table with roughly 10% missingness
yields = astable(J(1e5,5,randominteger(1, 20)/(randomuniform() > 0.1)));
For( i = 1, i <= N Col( yields ), i++,
yields[Loc( Is Missing( yields[0, i] ) ), i] = 0
);
3) 如果表中的数据是基于公式的,则在打算修复缺失的 JSL 开始执行时,公式可能已“写入”列,但可能尚未完成评估。 在代码运行之前,通过在代码前面添加以下行来确保所有公式都已完全更新:
Yields << run formulas;
4) 确保“Yields”没有引用除感兴趣的数据表之外的任何其他内容...不是列名、另一个变量名、表变量等。 因此,作为最佳实践,我建议在用于指向表的任何变量名中的某处使用“dt”;虽然很容易想象通过无意中将值矩阵或向量命名为“Yields”来覆盖表句柄“Yields”,但意外地将这样的矩阵或向量命名为“YieldDt”的可能性要小得多。 但是,由于如果您暂停执行,您的程序就会工作,因此我不认为这是问题所在。
如果 1) 和 2) 适合您,而 3) 和 4) 都不能解决问题,我将需要更多信息来帮助您:一个经过清理的示例表和一段可以针对该表运行的代码片段,以表明替换不适用于该表。
干杯,
布雷迪
回复:除非事后运行,否则部分脚本不会执行嗨马克。 它现在单独运行,但不能作为我的较大脚本的较小部分。 我想知道这是否不是一个脚本问题 - 更多的是另一个问题。 为什么一段代码在单独运行时会工作,而在作为较大脚本的较小部分运行时会失败(即使最后执行时就像在第一种情况下一样)?回复:除非事后运行,否则部分脚本不会执行你好布雷迪,
我感谢所有的建议和帮助。 但是,您提供的这部分代码似乎对我不起作用(更改表名称后)。 我觉得这很奇怪——我看不出为什么它不起作用。 有任何想法吗?
For( i = 1, i <= N Col( Yields ), i++,
Yields[Loc( Is Missing( Yields[0, i] ) ), i] = 0
);
稍微改一下我的问题:我当前的代码在单独运行时有效,但在作为较大代码的一小部分运行时则无效。 我觉得这本身很奇怪。 我很乐意更改我的代码,只是对我来说这似乎不是问题所在 - 因为(虽然不是“完美”)它确实有效! 这可能是一个错误吗? 或者有什么方法可以解决这个问题? 我调试时也没有错误。
回复:除非事后运行,否则部分脚本不会执行另外,如果您有可能的行或列,请将 nrows (dt) 或 ncols (dt) 绑定到变量并将其用作上索引,因此不需要每次迭代都评估 nrow(dt) 或 ncol(dt)。
//do some stuff
);nc = ncol (dt);
for (i = 1, i<=nc, i++,
JMP 16 允许您使用 foreach( ) 循环来执行此操作,不要与 for every row( ) 混淆。 与基本的 for() 循环相比,For Each() 还具有一些其他优点,例如变量的局部作用域以及在某些情况下执行速度更快。 如果您正在使用 JMP 16,请务必检查一下。
for each ( { i }, 1::nrow( dt ),
//do some stuff
);
回复:除非事后运行,否则部分脚本不会执行另外,让我第一个承认我从未使用过 For Each Row()。
曾经。
即使孩子们免费吃饭也不行。
如果我必须循环行(我试图避免这种情况,通过直接索引,就像我们在本例中所做的那样,通过使用 << 获取值并操作结果列表或矩阵等来一次性获取列的值) , 我写了一个合适的 for ( ) 循环。
我并不是说 For Each Row ( ) 永远不会起作用。 我是说它带有警告,但我不知道这些警告是什么。 因此,我像瘟疫一样避免使用 For Each Row () 并建议其他人也这样做,除非他们都 1) 愿意学习警告,并且 2) 愿意假设那些编辑、维护或以其他方式与代码交互的人未来也会如此。
后者不太可能发生,所以我从未考虑过采取前者。
干杯,
布雷迪
for (i =1, i<=nrow(dt), i++,
//do some stuff
);
回复:除非事后运行,否则部分脚本不会执行你好,
如果担心大型表的性能,您不妨尝试以下操作(注意,我使用 dt 作为表名)。 在中等表(100,000 行 x 5 列)上,我的机器上的性能差异非常明显,分别为 0.0056 秒和 0.8261 秒。 这有几个原因:
首先,Loc ( ) 和 Is Missing ( ) 函数速度很快,即使一次在整个列上使用也是如此,这就是我们在这里所做的。 也就是说,dt[0, i] 检索整个 i 列。
此外,通过直接对列建立索引,我们不必处理获取它们的名称,或从包含它们的列表中检索它们。
干杯,
布雷迪
Names Default To Here(1);
//create a table with roughly 10% missingness
dt = astable(J(1e5,5,randominteger(1, 20)/(randomuniform() > 0.1)));
For( i = 1, i <= N Col( dt ), i++,
dt[Loc( Is Missing( dt[0, i] ) ), i] = 0
);
回复:除非事后运行,否则部分脚本不会执行//Recode columns in Yield Table to give "0" instead of X's
yieldcols = Yields << get column names;
For( col = 1, col <= N Items( yieldcols ), col++,
For Each Row( If( Is Missing( As Column( yieldcols[col] )[] ), As Column( yieldcols[col] )[] = 0 ) )
);
回复:除非事后运行,否则部分脚本不会执行刚刚尝试过。 即使单独运行,这也不起作用。 我的原始脚本有效,但仅在单独运行时有效(事实上,在整个脚本运行后,我按 Ctrl+R 执行该部分)。回复:除非事后运行,否则部分脚本不会执行//Recode columns in Yield Table to give "0" instead of X's
yieldcols = Yields << get column names;
For( col = 1, col <= N Items( yieldcols ), col++,
For Each Row( If( Is Missing( As Column( yieldcols[k] )[] ), As Column( yieldcols[k] )[] = 0 ) )
);