Creazione di una tabella con formula nelle colonne - Random Normal() - da jmp esternoCIAO,
Qualcuno può aiutarmi con un codice JSL che genera una nuova tabella con una formula all'interno delle proprietà delle colonne?
Le dimensioni della tabella, i nomi delle colonne e i parametri per la formula provengono da un file jmp esterno come quello allegato.
Qualcuno può condividere un frammento di codice da cui iniziare?
Personalizzazione di massaOggetto: Creazione di una tabella con formula nelle colonne - Random Normal() - da jmp esternoRimuovere la colonna 1 è facile nello script, quindi non dovrebbe essere un problema. Vorrei creare una colonna con un nome specifico o rimuoverla utilizzando index
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");L'uso di Imposta ogni valore è migliore se non hai bisogno di formule, poiché è più veloce.
Per l'apprendimento... Eval(EvalExpr()) sicuramente non sono le cose più facili da capire, ma ci sono alcuni contenuti che potrebbero aiutare. Controllando velocemente ho trovato questi:
Oggetto: Creazione di una tabella con formula nelle colonne - Random Normal() - da jmp esternoLo script effettivo genera una colonna non definita " Clolumn 1".
E la generazione di colonne all'interno di New Table () non crea tale colonna. è solo estetica...
nel frattempo, ho uno script che ha una definizione di colonna singola e gli altri vengono aggiunti all'esterno della nuova colonna.
E la nuova tabella generata ha valori calcolati corretti. Tuttavia, se guardo all'interno della Formula, contiene l'espressione della sceneggiatura.
Posso mascherare questo fatto usando Imposta ogni valore(). Ma mi fa impazzire... 
E ora sono ossessivo per capire perché l'espressione non viene valutata correttamente. Non ho avuto successo usando Eval() Eval Expr() e Expr(). Credo di capirne le funzioni ma con la combinazione con Formula, nessuna possibilità.
Tuttavia, il mio problema iniziale è risolto con la tua proposta. Grazie!
Oggetto: Creazione di una tabella con formula nelle colonne - Random Normal() - da jmp esternoC'è un motivo specifico per cui vorresti creare le colonne all'interno di New Table ()? Non sono sicuro che sia possibile e se lo è, molto probabilmente renderà il codice più disordinato rispetto alla creazione dopo New Table().
Oggetto: Creazione di una tabella con formula nelle colonne - Random Normal() - da jmp esternoGrazie! Ha funzionato con questo codice proprio sotto. E mi aiuta molto!!
Tuttavia, ora sono motivato a imparare un po' di JSL. E ho pensato a una possibile implementazione. Secondo codice.
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"
il mio concetto per risolvere il mio 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 tableSfortunatamente, non so come usare "for loop" all'interno di "New Table" e valutare l'indice all'interno di Formula.
Presumo in qualche modo come con Eval, Eval Expr.
Ma non capisco la sintassi.
Credi che il mio concetto potrebbe funzionare anche con una sintassi corretta?
Cosa deve essere modificato?
Oggetto: Creazione di una tabella con formula nelle colonne - Random Normal() - da jmp esternoPuoi eseguire il loop su RandomNormal_dt.jmp con For Each Row e quindi ottenere valori dalle colonne. Utilizzo Eval(EvalExpr()) per aggiungere valori 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))))));
);

Quindi puoi aggiungere le righe secondo necessità. Dopo aver aggiunto le righe, puoi rimuovere le formule per rendere il datatable più veloce, se necessario. Se sai di quante righe hai bisogno, puoi sostituire Formula() con << Set Each Value() e creare la raccolta con un numero sufficiente di righe.