Wie füge ich einen Verweis auf einen dynamisch generierten Tabellenvariablennamen in eine Spaltenformel ein, sodass ich die Tabellenvariable später ändern und trotzdem die Spaltenwerte aktualisieren kann? Und dann tun Sie dies für eine unbekannte Anzahl von Spalten.
dt = Current Data Table();
NewCol = function({ColNr},
//Set a name table variable with the name of the column and RMSE appended to it
dt << Set Table Variable( concat(Column(ColNr)<< Get Name(),"RMSE"), 0 );
//Create a new column with the same name as the original column but with " with RMSE" at the end.
//Place a formula in this column which takes the original column value and add random RMSE as specified by the table variable to it.
Eval(
substitute(
expr(
dt<<NEW column=""></NEW>
Vielen Dank, dass du mich herausgefordert hast. Ich habe es noch einmal versucht und es gelöst 
Sie haben Recht, das Erstellen des Spaltennamens funktioniert einwandfrei. Es funktioniert nicht zum Erstellen des Formelteils des neuen Spaltenausdrucks.
Was ich tun musste, war :Name( "...") um die Spalten- und Tabellenvariablennamen in der Parse-Funktion zu setzen.
dt = New Table( "Untitled 9",
Add Rows( 0 ),
New Column( "Pred Formula Thickness (A)",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values(
[-1.09815926721176, -0.143977108758327, -1.60078929360768,
-0.340409665497429, -0.581215173360104, 0.233876291958488,
-0.357108531367114, 0.0704280592629584, 1.86236889119533,
0.669812241478143, -0.00962200322380528, 1.33041117732878,
0.533367791752501, 2.24183743599671, -0.506060621538248]
),
Set Display Width( 145 )
)
);
ColNr = 1;
//Create the table variable based on the column name with RMSE added to it.
dt << Set Table Variable( concat(column(ColNr)<< Get Name()," RMSE"), 0 );
//Create the text for the column formula. Notice that the formula stored in test is correct. It is the 'column name' + 'the table variable' multiplied with random normal.
test = ":Name( \!"" || char(column(ColNr)<< Get Name()) || "\!") + :Name( \!"" || char(column(ColNr)<< Get Name()) || " RMSE\!") * Random Normal()";
//But when putting this in a column formula equation, the parser stops parsing after the second repeat of the column name. In an ideal world I would just refer to the table variable directly.
eval(parse( "dt<<NEW column=""></NEW>
Die Methode Eval(Parse()) kann problemlos mit komplexen Spaltennamen umgehen. Sie müssen nur erkennen, dass solche Probleme bestehen könnten. Hier ist ein einfaches Beispiel
Names Default to here(1);
dt = New Table( "big class",
Add Rows( 40 ),
New Column(
"Complex column a+7/(1_2)",
Numeric,
"Continuous",
Format( "Fixed Dec", 5, 0 ),
Set Values(
[59, 61, 55, 66, 52, 60, 61, 51, 60, 61, 56, 65, 63, 58, 59, 61, 62, 65, 63,
62, 63, 64, 65, 64, 68, 64, 69, 62, 64, 67, 65, 66, 62, 66, 65, 60, 68, 62,
68, 70]
)
),
New Column(
"weight",
Numeric,
"Continuous",
Format( "Fixed Dec", 5, 0 ),
Set Values(
[95, 123, 74, 145, 64, 84, 128, 79, 112, 107, 67, 98, 105, 95, 79, 81, 91,
142, 84, 85, 93, 99, 119, 92, 112, 99, 113, 92, 112, 128, 111, 105, 104,
106, 112, 115, 128, 116, 134, 172]
)
)
);
col names = dt<<GET column="" names=""></GET>
Ich suche immer noch nach einer robusteren Lösung, da die Methode parse(eval()) nicht gut mit () im Namen der Tabellenvariablen oder dem Spaltennamen umgeht.
Oh, ich verstehe. Da Sie die Spaltennamen spontan generieren, gibt es einige Strategien, die Sie verwenden können.
Die erste besteht darin, einfach ein paar „substitute into()“-Befehle für eine Liste von Spaltennamen zu verwenden, die Sie zur Laufzeit generieren. Dies wird in den meisten Fällen im Allgemeinen gut funktionieren.
Zweitens könnten Sie die Methode Eval(Parse()) verwenden, bei der Sie programmgesteuert mithilfe von Verkettungsbefehlen eine Zeichenfolge Ihrer JSL erstellen. Das ist meine Wunderwaffe. Insbesondere bei Dingen im Zusammenhang mit Spalteneigenschaften und -manipulation. Es macht alle zusätzlichen Eval()-Befehle überflüssig, da das Skript im Grunde den fertigen Befehl als Zeichenfolge „eingibt“ und ihn in einen Ausdruck umwandelt. Anschließend führen Sie einfach den Ausdruck aus.Betreff: JSL: So erstellen Sie einen Verweis auf eine Tabellenvariable innerhalb einer SpaltenformelDas Problem besteht darin, dass ich die Tabellenvariablennamen in der Spaltenformel nicht fest codieren kann, da die Anzahl der Spalten sowie die Namen dieser Spalten unbekannt sind. Das Erstellen der Tabellenvariablen ist machbar. Der schwierige Teil besteht darin, sie in der Spaltenformel zu referenzieren.Betreff: JSL: So erstellen Sie einen Verweis auf eine Tabellenvariable innerhalb einer SpaltenformelSie beginnen mit der Generierung Ihrer Tabellenvariablen:
dt << New Table Variable("RMSE_1", 30);
Sie würden dies wahrscheinlich als Teil Ihrer Schleife tun, bevor Sie die neue Formelspalte generieren.
Danach wird eine Tabellenvariable ähnlich wie Spalten referenziert, also wie oben:
// Add the table variable
dt << New Table Variable( "RMSE_1", 30 );
// Add the column referencing the table variable
dt << New Column( "Column 1",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula( :RMSE_1 ^ 2 )
);
am besten,
M