¿Qué hace que la fórmula se evalúe una y otra vez?Noté un comportamiento inesperado en Jmp:
Después de crear una columna de Fórmula con una Fórmula personalizada, se evalúa otra columna de Fórmula cada vez Selecciono una celda en la tabla de datos.
¿Por qué se evalúa la fórmula tantas veces?
- la eliminación de la miX =1; miX De la primera fórmula se detiene el comportamiento.
- eliminar la fórmula personalizada de la segunda fórmula detiene el comportamiento
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() ) );
Automatización y secuencias de comandosRe: ¿Qué hace que la fórmula se evalúe una y otra vez?Quizás, por alguna razón, JMP se vea obligado a realizar una reevaluación si se utilizan columnas de fórmula con funciones personalizadas.
Usando la fórmula personalizada de ejemplo de JMP y el ejemplo de Craige de https://community.jmp.com/t5/Discussions/Why-does-selecting-deselecting-rows-trigger-column-formulas-to/mp/188823/highlight/true#M40750 . Ejecute el script, seleccione una fila, marque lo, ejecute el resto del script después de detenerlo, haga clic en la fila nuevamente.
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);
También puede ver este comportamiento si simplemente vuelve a ejecutar << Ejecutar fórmulas. Si no tiene la fórmula personalizada allí, no se imprime nada (excepto Scriptable[]) y si agrega la fórmula usando la función personalizada, todas las fórmulas se volverán a ejecutar en cada << Ejecutar fórmulas (básicamente se comporta como << volver a ejecutar fórmulas, todas las fórmulas "deben" ser reevaluadas).
Re: ¿Qué hace que la fórmula se evalúe una y otra vez?Al seleccionar celdas manualmente...
Interesante #1:
(con respecto a columnas como c3 sin variables) solo se actualiza la última fila seleccionada y la fila recién seleccionada (siga las marcas de tiempo). Quizás con la idea: Estas son las 2 filas con potencial cambio manual ?
Mmm.
Interesante #2:
Para una columna de fórmula con una variable, como c1, se vuelve a evaluar toda la columna.
Quizás con la idea: la variable podría haber cambiado, así que asegurémonos y actualicemos todos los valores.
Pero, por otro lado, cambiar la variable a través de JSL (i=-1000) no activa una actualización (?)