是什麼讓公式一遍又一遍地求值?我注意到 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) 更改變數不會觸發更新(?)