是什么让公式一遍又一遍地求值?我注意到 Jmp 中有一个意外的行为:
使用自定义公式创建公式列后,将评估另一个公式列每次我在数据表中选择一个单元格。
为什么公式要计算这么多次?
- 删除我的X=1;我的X第一个公式停止了行为
- 从第二个公式中删除自定义公式会停止该行为
跳跃17.2
Names Default To Here( 1 );
row_count = 10;
dt = New Table( "myTable", Add Rows( row_count ), New Column( "X", set each value( Row() ) ) );
dt << New Column( "Formula As Constant",
Formula(
if(row()==1,write("\!N"));
Write("+1 ");
myX = 1;
myX
)
);
new namespace("test");
Add Custom Functions( New Custom Function( "test", "myFunc", Function( {}, 1 ) ) );
dt << New Column( "Formula via Custom Formula", Formula( test:myFunc() ) );
自动化和脚本编写回复:是什么让公式反复求值?如果使用具有自定义函数的公式列,JMP 可能会由于某种原因被迫执行重新评估。
使用 JMP 的示例自定义公式和 Craige 的示例https://community.jmp.com/t5/Discussions/Why-does-selecting-deselecting-rows-trigger-column-formulas-to/mp/188823/highlight/true#M40750 。 运行脚本,选择一行,选中 lo,停止后运行脚本的其余部分,再次单击行。
Names Default To Here(1);
dt = New Table("Untitled",
add rows(3),
// EVERYTHINGCOL depends on everything. it evaluates last.
New Column("EVERYTHINGCOL", Formula(
Write("\!nEVERYTHINGCOL,row" || Char(Row()));
:ROWSTATECOL + :INDEPCOL + :DEPONINDEP;
)
),
// DEPONINDEP depends on INDEPCOL, but not ROWSTATECOL.
New Column("DEPONINDEP",
Formula(
Write("\!nDEPONINDEP,row" || Char(Row()));
:INDEPCOL + 1;
)
),
// INDEPCOL is independent. It evaluates early, maybe first.
New Column("INDEPCOL",
Formula(
Write("\!nINDEPCOL,row" || Char(Row()));
17;
)
),
// ROWSTATECOL is directly dependent on row state information. It evaluates early, maybe first.
New Column("ROWSTATECOL",
Formula(
Write("\!nROWSTATECOL,row" || Char(Row()));
Selected(Row State());
)
)
);
dt << Run Formulas;
Write("\!N -------------------- INITIAL PRINTS----------------\!N");
// Clear Log();
dt << select rows(1);
dt << Run Formulas;
Write("\!N -------------------- SEL ROW PRINTS 1----------------\!N");
funcDef = Function({x, y = 10}, x + y);
newAdd = New Custom Function("myNamespace", "Add Ten", funcDef);
newAdd << Formula Category("NumberStuff");
Add Custom Functions(newAdd);
new_col = dt << New Column("AddTen", Formula(
Write("\!nAddTen,row" || Char(Row()));
myNamespace:Add Ten(Row(), 1))
);
dt << select rows(2);
dt << Run Formulas;
Write("\!N -------------------- SEL ROW PRINTS 2----------------\!N");
// new_col << Suppress Eval(1);
如果您只是重新运行 << 运行公式,您也可以看到此行为。 如果您没有自定义公式,则不会打印任何内容(除了 Scriptable[]),如果您使用自定义函数添加公式,则所有公式都将在每个 << 运行公式上重新运行(基本上行为类似于 << 重新运行公式,所有公式“必须”重新计算)。
回复:是什么让公式反复求值?手动选择单元格时...
有趣的#1:
(关于像 c3 这样没有变量的列)仅更新最后选定的行和新选定的行(跟踪时间戳)。 也许有这样的想法:这些是可能需要手动更改的 2 行?
嗯。
有趣的#2:
对于带有变量的公式列(例如 c1),将再次计算整个列。
也许有这样的想法:变量可能已经改变,所以让我们确定并更新所有值。
但另一方面,通过 JSL (i=-1000) 更改变量不会触发更新(?)