Qu'est-ce qui fait que la formule est évaluée encore et encore ?J'ai remarqué un comportement inattendu dans Jmp :
Après avoir créé une colonne de formule avec une formule personnalisée, une autre colonne de formule est évaluée à chaque fois Je sélectionne une cellule dans le tableau de données.
Pourquoi la formule est-elle évaluée autant de fois ?
- retirer le monX =1; monX à partir de la première formule, le comportement s'arrête
- la suppression de la formule personnalisée de la deuxième formule arrête le comportement
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() ) );
Automatisation et scriptsRe : Qu'est-ce qui fait que la formule est évaluée encore et encore ?Peut-être que JMP est, pour une raison quelconque, obligé d'effectuer une réévaluation si des colonnes de formules avec des fonctions personnalisées sont utilisées.
En utilisant l'exemple de formule personnalisée de JMP et l'exemple de Craige de https://community.jmp.com/t5/Discussions/Pourquoi-does-selecting-deselecting-rows-trigger-column-formulas-to/mp/188823/highlight/true#M40750 . Exécutez le script, sélectionnez une ligne, vérifiez lo, exécutez le reste du script après l'arrêt, cliquez à nouveau sur la ligne.
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);
Vous pouvez également constater ce comportement si vous réexécutez simplement << Exécuter les formules. Si vous n'avez pas la formule personnalisée, rien n'est imprimé (sauf pour Scriptable[]) et si vous ajoutez la formule à l'aide d'une fonction personnalisée, toutes les formules seront réexécutées à chaque << Run Formulas (se comporte essentiellement comme << rerun formules, toutes les formules « doivent être » réévaluées).
Re : Qu'est-ce qui fait que la formule est évaluée encore et encore ?Lors de la sélection manuelle de cellules...
Intéressant #1 :
(concernant les colonnes comme c3 sans variables) seule la dernière ligne sélectionnée et la ligne nouvellement sélectionnée sont mises à jour (suivez les horodatages). Peut-être avec l'idée : Ce sont les 2 lignes avec un potentiel changement manuel ?
Hum.
Intéressant #2 :
Pour une colonne de formule avec une variable, comme c1, la colonne entière est à nouveau évaluée.
Peut-être avec l'idée : la variable aurait pu changer, alors assurons-nous et mettons à jour toutes les valeurs.
Mais par contre, changer la variable via JSL (i=-1000) ne déclenche pas de mise à jour (?)