¿Cómo inserto una referencia a un nombre de variable de tabla generado dinámicamente dentro de una fórmula de columna para que luego pueda cambiar la variable de tabla y aún tener los valores de columna actualizados? Y luego haga esto para un número desconocido de columnas.
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>
Gracias por desafiarme, lo intenté una vez más y lo resolví 
Tiene razón, crear el nombre de la columna funciona bien. No funciona para crear la parte de fórmula de la nueva expresión de columna.
Lo que tenía que hacer era poner :Name( "...") alrededor de los nombres de las variables de la columna y la tabla en la función de análisis.
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>
El método Eval(Parse()) puede manejar fácilmente nombres de columna complejos. Solo necesita reconocer que tales problemas pueden existir. Aquí hay un ejemplo simple
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>
Todavía estoy buscando una solución más robusta ya que el método parse(eval()) no trata bien con () en el nombre de la variable de la tabla o el nombre de la columna.
Ah, claro. Dado que está generando los nombres de las columnas sobre la marcha, hay un par de estrategias que podría usar.
El primero es simplemente usar un par de comandos "sustituir en ()" en una lista de nombres de columna que genera en tiempo de ejecución. Esto generalmente funcionará bien en la mayoría de los casos.
En segundo lugar, podría usar el método Eval(Parse()), donde construye una cadena de su JSL mediante programación usando comandos de concatenación. Esta es mi bala de plata. Particularmente con cosas relacionadas con las propiedades y la manipulación de columnas. Elimina la necesidad de todos los comandos adicionales de Eval() porque el script básicamente "escribe" el comando terminado como una cadena y lo convierte en una expresión. Luego solo ejecuta la expresión.Re: JSL: cómo crear una referencia a una variable de tabla dentro de una fórmula de columnaEl problema es que no puedo codificar los nombres de las variables de la tabla en la fórmula de la columna, ya que se desconoce el número de columnas y los nombres de esas columnas. Crear las variables de la tabla es factible. Hacer referencia a ellos en la fórmula de la columna es la parte difícil.Re: JSL: cómo crear una referencia a una variable de tabla dentro de una fórmula de columnaComenzarías generando las variables de tu tabla:
dt << New Table Variable("RMSE_1", 30);
Probablemente haría eso como parte de su bucle antes de generar la nueva columna de fórmula.
Después de eso, se hace referencia a una variable de tabla de manera similar a las columnas, por lo que desde arriba:
// 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 )
);
mejor,
METRO