¿Cómo utilizar valores de columna como entrada para una fórmula en un script?Todo,
Creo que mi pregunta es muy básica pero todavía tengo que encontrar una respuesta.
Tengo una tabla de datos como se muestra a continuación.

Yo deseo
a) incluir 3 nuevas columnas denominadas %CFB columna 3, %CFB columna 4 y %CFB columna 5. %CFB significa % de cambio desde el valor inicial.
b) En cada nueva columna deseo ingresar el porcentaje de cambio desde la línea de base con valores derivados de la siguiente fórmula
%CFB = (x - Columna 3)/Columna 3, donde "x" se reemplazará con valores de las Columnas 3, 4 o 5 en cada iteración codificada a continuación.La columna 3 es el valor de referencia.
dt = Current Data Table();
startcol = 3;
endcol = 5;
For( i = startcol, i <= endcol, i++,
data_col = Column( i ) << get name;
New column ("%CFB " || data_col) << Formula((( :data_col - :column 3) / :column 3) * 100 ));
Usando el script anterior, pude crear las nuevas columnas, pero no se colocan en ellas ningún resultado de la fórmula.Cuando cambio manualmente columna 3 para col_datos en la fórmula, todas las columnas nuevas se evalúan como cero, como era de esperar.Esto me dice que la fórmula es al menos correcta y que la variable data_col no se interpreta/sustituye como me gustaría.Se agradecería cualquier idea para hacer que esto funcione.
Gracias de antemano por su ayuda
floyd zorro
Re: ¿Cómo utilizar valores de columna como entrada para una fórmula en un script?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />No sé cuántas opiniones son bienvenidas, pero ahí va.
Personalmente, soy un gran oponente de Eval(Parse()), simplemente porque reduce drásticamente la legibilidad dentro del editor.He visto scripts de 5000 líneas que son, en su mayor parte, completamente rosas (o del color que elijas para tus cadenas).Con la capacidad de sustituir expresiones, mantienes intacto el resaltado de sintaxis y creo que hace que sea mucho más fácil editar el guión de otras personas.
Todavía uso muy ocasionalmente eval(parse()), aunque intento usar JSL quote() cuando es necesario.
Re: ¿Cómo utilizar valores de columna como entrada para una fórmula en un script?Excelente nota sobre cómo lidiar con el alcance allí. semana Envolviéndolo todo junto para floydfoxfb con algún formato de código.
For( i = startcol, i <= endcol, i++,
data_col = Column( i ) << get name;
new_col_name = "%CFB " || data_col;
Eval(
Eval Expr(
dt << New Column( Expr(new_col_name),
Numeric,
Continuous,
Formula( ((Column( dt, Expr( data_col ) )[] - :column 3) / :column 3) * 100 )
)
)
);
);
Otra solución alternativa al alcance de la variable sería utilizar Establecer cada valor (ecuación) en lugar de Fórmula (ecuación).Esto tiene la ventaja de utilizar menos recursos ya que no se calcula una fórmula, pero tiene el inconveniente de una pérdida al modificar dicha fórmula.
Como ocurre con todo lo bueno, hay muchas formas de abordar un problema utilizando las herramientas adecuadas.Como mencionaste, Substitute() también es una excelente opción cuando las cosas comienzan a avanzar.Substitute es especialmente útil en combinación con Parse() que convierte cadenas en código JSL y Eval() que luego permite que se ejecute JSL, esto conduce a declaraciones Eval(Parse(Substitute())).Esta última técnica es particularmente útil cuando se incluye funcionalidad en plataformas JMP integradas.Para ilustrar mejor la combinación de parse() y eval(parse) he incluido un ejemplo sencillo.

¡Feliz codificación!
Re: ¿Cómo utilizar valores de columna como entrada para una fórmula en un script?Hola,
Con este ejemplo, la variable data_col todavía aparece en la fórmula.Dado que está asignando data_col en un bucle For, cualquier intento de evaluar las fórmulas después de que finalice el bucle producirá los mismos valores en las tres columnas nuevas.Esto se debe a que data_col representará el último valor del bucle For, "Columna 5".Además, suponga que guarda la tabla y luego cierra JMP.Cuando abre la tabla nuevamente en una nueva instancia de JMP e intenta evaluar la fórmula, aparecerá un error porque JMP ya no sabe qué debe representar data_col.
Cuando utilice una variable en una fórmula, deberá hacer algo para indicarle a JMP que reemplace la variable con su valor antes de evaluar la fórmula.Puedes usar Substitute(), pero encuentro que el método Eval Expr() (como vince.faller0 mencionado) es más fácil de implementar para la mayoría de las personas.Eval Expr() le dice a JMP que evalúe (reemplace) cualquier variable incluida en una función Expr() dentro de la expresión que usted proporciona como argumento. Una evaluación externa () hará que JMP evalúe toda la declaración de Nueva columna después de que se haya producido el reemplazo.Nota de uso de JMP 41824 también demuestra este concepto.
Espero que esto ayude.
wendy
Re: ¿Cómo utilizar valores de columna como entrada para una fórmula en un script?Vicente,
Gracias por esto.Francamente, tendré que leer un poco sobre la expresión que proporcionaste, pero agradezco tu comprensión de por qué mi código no funcionó.
Saludos
floyd
Re: ¿Cómo utilizar valores de columna como entrada para una fórmula en un script?Nate,
Gracias, este código funciona y tiene el beneficio adicional de que puedo entender la lógica detrás del código.
floyd
Re: ¿Cómo utilizar valores de columna como entrada para una fórmula en un script?vince.faller0 De hecho, ha identificado con precisión la raíz del problema.No hay ninguna columna denominada data_col en la tabla de datos.Por lo tanto, el código tal como está escrito se refiere a algo que no existe.Además, Vince muestra algunas de las formas poderosas de usar JSL para escribir código que contenga referencias dinámicas.Dicho esto, en cualquier buen lenguaje tendrás múltiples opciones para ejecutar la lógica.
Sugeriría utilizar un formato alternativo para hacer referencia a la columna.Si bien el formato simple es usar el punto y coma y el nombre de la columna para hacer referencia a las columnas de la tabla de datos actual, una forma más poderosa es usar el formato de columna (referencia de la tabla de datos, cadena de columna o número).A continuación modifiqué ligeramente su código para usar ese formato.
dt = Current Data Table();
startcol = 3;
endcol = 5;
For( i = startcol, i <= endcol, i++,
data_col = Column( i ) << get name;
col_name = "%CFB " || data_col;
dt << New Column(col_name,
Numeric,
Continuous,
Formula( ((column(dt, data_col)[] - :column 3) / :column 3) * 100 ) );
);
Re: ¿Cómo utilizar valores de columna como entrada para una fórmula en un script?No puedes hacer :variable (especialmente de una cadena, que es lo que te dará <
Si lo cambias a
data_col = Column( i ) ;
Eval(EvalExpr(New column ("%CFB " || Expr(data_col<<GET name=""></GET>
deberia de funcionar.
Simplemente sustituye todos los Expr() dentro de EvalExpr() con sus valores reales en lugar de variables.