Was führt dazu, dass die Formel immer wieder ausgewertet wird?Mir ist ein unerwartetes Verhalten in Jmp aufgefallen:
Nachdem Sie eine Formelspalte mit einer benutzerdefinierten Formel erstellt haben, wird eine weitere Formelspalte ausgewertet jedes Mal Ich wähle eine Zelle in der Datentabelle aus.
Warum wird die Formel so oft ausgewertet?
- entferne den myX =1; myX Die erste Formel stoppt das Verhalten
- Das Entfernen der benutzerdefinierten Formel aus der zweiten Formel stoppt das Verhalten
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() ) );
Automatisierung und SkripterstellungBetreff: Warum wird die Formel immer wieder ausgewertet?Möglicherweise ist JMP aus irgendeinem Grund gezwungen, eine Neuauswertung durchzuführen, wenn Formelspalten mit benutzerdefinierten Funktionen verwendet werden.
Unter Verwendung der benutzerdefinierten Beispielformel von JMP und des Beispiels von Craige aus https://community.jmp.com/t5/Discussions/Why-does-selecting-deselecting-rows-trigger-column-formulas-to/mp/188823/highlight/true#M40750 . Führen Sie das Skript aus, wählen Sie eine Zeile aus, aktivieren Sie lo, führen Sie nach dem Stoppen den Rest des Skripts aus und klicken Sie erneut auf Zeile.
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);
Sie können dieses Verhalten auch sehen, wenn Sie einfach << Formeln ausführen erneut ausführen. Wenn Sie die benutzerdefinierte Formel dort nicht haben, wird nichts gedruckt (außer Scriptable[]) und wenn Sie die Formel mit einer benutzerdefinierten Funktion hinzufügen, werden alle Formeln bei jedem << Formeln ausführen erneut ausgeführt (verhält sich im Grunde wie << erneut ausführen). Formeln „müssen“ alle Formeln neu ausgewertet werden).
Betreff: Warum wird die Formel immer wieder ausgewertet?Bei der manuellen Auswahl von Zellen ...
Interessant Nr. 1:
(betrifft Spalten wie c3 ohne Variablen) nur die zuletzt ausgewählte Zeile und die neu ausgewählte Zeile werden aktualisiert (verfolgen Sie die Zeitstempel). Vielleicht mit der Idee: Dies sind die beiden Zeilen mit einer möglichen manuellen Änderung ?
Hm.
Interessant #2:
Bei einer Formelspalte mit einer Variablen wie c1 wird die gesamte Spalte erneut ausgewertet.
Vielleicht mit der Idee: Die Variable könnte sich geändert haben, also gehen wir sicher und aktualisieren alle Werte.
Aber andererseits löst das Ändern der Variablen über JSL (i=-1000) kein Update aus (?)