Cosa fa sì che la formula venga valutata più e più volte?Ho notato un comportamento inaspettato in Jmp:
Dopo aver creato una colonna formula con una formula personalizzata, viene valutata un'altra colonna formula ogni volta Seleziono una cella nella tabella dati.
Perché la formula viene valutata così tante volte?
- rimuovendo il mioX =1; myX dalla prima formula interrompe il comportamento
- la rimozione della formula personalizzata dalla seconda formula interrompe il comportamento
Salto 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() ) );
Automazione e scriptingRe: Cosa fa sì che la formula venga valutata più e più volte?Forse JMP è costretto per qualche motivo a eseguire una nuova valutazione se vengono utilizzate colonne formula con funzioni personalizzate.
Utilizzando la formula personalizzata di esempio di JMP e l'esempio di Craige da https://community.jmp.com/t5/Discussions/Perché-does-selecting-deselecting-rows-trigger-column-formulas-to/mp/188823/highlight/true#M40750 . Esegui lo script, seleziona una riga, seleziona lo, esegui il resto dello script dopo l'interruzione, fai nuovamente clic sulla riga.
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);
Puoi anche vedere questo comportamento se esegui nuovamente << Esegui formule. Se non hai la formula personalizzata lì, non viene stampato nulla (tranne Scriptable[]) e se aggiungi la formula utilizzando la funzione personalizzata, tutte le formule verranno rieseguite su ogni << Esegui formule (sostanzialmente si comporta come << rerun formule, tutte le formule “vanno” rivalutate).
Re: Cosa fa sì che la formula venga valutata più e più volte?Quando si selezionano manualmente le celle...
Interessante n. 1:
(per quanto riguarda colonne come c3 senza variabili) solo l'ultima riga selezionata e la riga appena selezionata vengono aggiornate (traccia i timestamp). Magari con l'idea: Queste sono le 2 righe con una potenziale modifica manuale ?
Uhm.
Interessante n. 2:
Per la colonna formula con una variabile, come c1, l'intera colonna viene valutata nuovamente.
Forse con l'idea: la variabile potrebbe essere cambiata, quindi siamo sicuri e aggiorniamo tutti i valori.
Ma d'altra parte, la modifica della variabile tramite JSL (i=-1000) non attiva un aggiornamento (?)