Creando una tabla con fórmula en las columnas - Random Normal() - desde jmp externoHola,
¿Alguien puede ayudarme con un código JSL, que genere una nueva tabla con una fórmula dentro de las propiedades de las columnas?
El tamaño de la tabla, los nombres de las columnas y los parámetros de la fórmula provienen de un archivo jmp externo como el adjunto.
¿Alguien puede compartir algún fragmento de código sobre cómo empezar a usarlo?
Personalización masivaRe: Crear una tabla con fórmula en las columnas - Random Normal() - desde un jmp externoEliminar la Columna 1 es fácil en el script, por lo que no debería ser un problema. Crearía una columna con un nombre específico o la eliminaría usando el índice
Names Default To Here(1);
dt = New Table("testtable", add rows(1),
new column("REMOVETHIS")
);
wait(1); //for demonstration purposes<BR />//dt << Delete Column(1);
dt << Delete Columns("REMOVETHIS");Usar Establecer cada valor es mejor si no necesita fórmulas, ya que es más rápido.
Para aprender... Eval(EvalExpr()) definitivamente no son las cosas más fáciles de entender, pero hay algo de contenido que podría ayudar. Comprobando rápidamente encontré estos:
Re: Crear una tabla con fórmula en las columnas - Random Normal() - desde un jmp externoEl script real genera una columna indefinida " Clolumn 1".
Y generar columnas dentro de New Table () no crea dicha columna. Es solo cosmético...
mientras tanto, tengo un script que tiene una definición de columna única y los demás se agregan fuera de la nueva columna.
Y la nueva tabla generada tiene valores calculados correctos. Sin embargo, si miro dentro de la Fórmula, entonces contiene la expresión del script.
Puedo enmascarar este hecho usando Establecer cada valor (). Pero me vuelve loco... 
Y ahora estoy obsesionado por entender por qué la expresión no se evalúa correctamente. No tuve éxito usando Eval () Eval Expr() y Expr(). Creo que entiendo sus funciones, pero con la combinación con Formula, no hay posibilidad.
Sin embargo, mi problema inicial se soluciona con tu propuesta. ¡Gracias!
Re: Crear una tabla con fórmula en las columnas - Random Normal() - desde un jmp externo¿Hay alguna razón específica por la que desearía crear las columnas dentro de New Table ()? No estoy seguro de que sea posible y, si lo es, lo más probable es que haga que el código sea más complicado en comparación con crearlos después de New Table().
Re: Crear una tabla con fórmula en las columnas - Random Normal() - desde un jmp externo¡Gracias! Funcionó con este código justo debajo. Y me ayuda mucho!!
Sin embargo, ahora estoy motivado para aprender un poco de JSL. Y pensé en una posible implementación. Segundo código.
Clear Globals();
Names Default To Here( 1 );
//mydt =
//Data Table( "dt_RandomNormalParameter" ) <<
mydt = Current Data Table();
// New data table
my_newdt = New Table( "Table Name", Add Row ( 1000 ));
//lets use formulas, we can easily add more rows if needed
For Each Row(
mydt,
columnName = As Column(mydt, "Analysis Columns");
meanValue = As Column(mydt, "Mean");
stdDevValue = As Column(mydt, "Std Dev");
//use eval expr to get values in formula
Eval(Eval Expr(my_newdt << New Column(columnName, Numeric, Continuous, Formula(Random Normal(Expr(meanValue), Expr(stdDevValue))))));
);
// Code adds Column "Column 1"
mi concepto para resolver mi problema:
Clear Globals();
Names Default To Here( 1 );
mydt = Current Data Table();
// New data table
my_newdt = New Table( "Table Name",
Add Rows (N Rows ( mydt )), // row count can be set by hand e.g. 1000
//For ( i = 1, i <= N Rows ( mydt ), i++, // for loop is not executed
New Column( Column(mydt, 1 )[1] , // Loop i==1
Numeric,
"Continuous",
Format( "Best", 6 ),
Formula( Random Normal( Column(mydt, :Mean )[1], Column(mydt, :Std Dev )[1] ) )// Column(mydt, :Mean )[1] is not evalueted
),
New Column( Column(mydt, 1 )[2] , // Loop i ==2
Numeric,
"Continuous",
Format( "Best", 6 ),
Formula( Random Normal( Column(mydt, :Mean )[2], Column(mydt, :Std Dev )[2] ) )//// Column(mydt, :Mean )[1] is not evalueted
)
//)// for loop
)// New data tableDesafortunadamente, no sé cómo usar "for loop" dentro de "New Table" y evaluar el índice dentro de Formula.
Supongo que de alguna manera con Eval, Eval Expr.
Pero no entiendo la sintaxis.
¿Crees que mi concepto también podría funcionar con la sintaxis adecuada?
¿Qué necesita ser modificado?
Re: Crear una tabla con fórmula en las columnas - Random Normal() - desde un jmp externoPuede recorrer su RandomNormal_dt.jmp con For Each Row y luego obtener valores de las columnas. Usar Eval(EvalExpr()) para agregar valores a Formula.
Names Default To Here(1);
dt_random = New Table("RandomNormal_dt",
Add Rows(20),
New Column("Analysis Columns",
Character(6),
"Nominal",
Set Values(
{"Name1", "Name2", "Name3", "Name4", "Name5", "Name6", "Name7", "Name8", "Name9", "Name10", "Name11", "Name12", "Name13", "Name14","Name15", "Name16", "Name17", "Name18", "Name19", "Name20"}
),
),
New Column("Mean", Numeric, "Continuous", Format("Best", 6), Set Values([1, 1, 0, 0, 0, 2, 2, 3, 3, 5, 10, -5, -6, 3, 3, 3, 3, 3, 0.5, 0.5]), ),
New Column("Std Dev",
Numeric,
"Continuous",
Format("Best", 6),
Set Values(
[0.0059167075785471, 0.00455419279075633, 0.00421951193571742, 0.00421951193571742, 0.00440945078910684, 0.00440945078910684,
0.0102216984358101, 0.00419398115162298, 0.0808821732109718, 0.0876924473662647, 0.119338972830502, 0.0918654224334168,
0.0921864791037008, 0.0868549769597964, 0.0808821732109718, 0.0865262154672911, 0.186459394109712, 0.189566585675401, 0.0876924449303901,
0.0434724818197371]
),
)
);
//create collection table
dt = New Table("Analysis");
//lets use formulas, we can easily add more rows if needed
For Each Row(
dt_random,
columnName = As Column(dt_random, "Analysis Columns");
meanValue = As Column(dt_random, "Mean");
stdDevValue = As Column(dt_random, "Std Dev");
//use eval expr to get values in formula
Eval(Eval Expr(dt << New Column(columnName, Numeric, Continuous, Formula(Random Normal(Expr(meanValue), Expr(stdDevValue))))));
);

Luego puede agregar filas según sea necesario. Después de agregar filas, puede eliminar fórmulas para hacer que la tabla de datos sea más rápida si es necesario. Si sabe cuántas filas necesita, puede reemplazar Formula() con << Establecer cada valor() y crear la colección con suficientes filas.