数式が何度も評価されるのはなぜですか?Jmp で予期しない動作に気づきました。
カスタム数式を使用して数式列を作成した後、別の数式列が評価されます毎回データテーブル内のセルを選択します。
数式が何度も評価されるのはなぜですか?
- を削除するmyX =1; myX最初の式から動作を停止します
- 2 番目の数式からカスタム数式を削除すると動作が停止します
Jmp 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() ) );
自動化とスクリプト作成Re: 数式が何度も評価されるのはなぜですか?おそらく、カスタム関数を含む数式列が使用されている場合、JMP は何らかの理由で再評価を実行する必要があると考えられます。
JMP のカスタム式の例と Craige の例を使用します。 https://community.jmp.com/t5/Discussions/Why-does-selecting-deselecting-rows-trigger-column-formulas-to/mp/188823/highlight/true#M40750 。 スクリプトを実行し、1 行を選択し、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);
<< Run Formulas を再実行した場合にも、この動作が確認できます。 そこにカスタム数式がない場合は何も出力されません (Scriptable[] を除く)。カスタム関数を使用して数式を追加すると、すべての数式が << 式の実行ごとに再実行されます (基本的には << rerun のように動作します)式、すべての式を再評価する必要があります)。
Re: 数式が何度も評価されるのはなぜですか?セルを手動で選択する場合...
興味深いその1:
(変数のない c3 のような列に関して) 最後に選択された行と新しく選択された行だけが更新されます (タイムスタンプを追跡します)。 おそらく次のようなアイデアが考えられます。これらは手動で変更される可能性のある 2 行です?
うーん。
興味深いその2:
c1 などの変数を含む数式列の場合、列全体が再評価されます。
おそらく、「変数が変更されている可能性があるので、すべての値を確実に更新しましょう」というアイデアが考えられます。
しかし一方で、JSL (i=-1000) 経由で変数を変更しても更新はトリガーされません (?)