Intento crear una columna y llenarla con una fórmula, pero aparece un error.Ver más... For (j=3, j<=10, j=j+2,
ColLen=Length(Char(Column name (j)));
ColName=Left (Char(Column Name(j)),ColLen -5);
NewCol=Substr(ColName,6);
New Column(
"Delta: "||NewCol,
Numeric,
Formula (
(Column (j)- Column(j+1))
)
)
);
Automatización y secuencias de comandosRe: Intento crear una columna y llenarla con una fórmula, pero aparece un error.JSL usa un alcance dinámico: creo que está trabajando bajo la suposición implícita del alcance léxico (que usan la mayoría de los lenguajes de programación).
Debido a que JSL usa un alcance dinámico, la resolución de alcance para el nombre j se hace en tiempo de ejecución , y cuando la fórmula calcula el nombre j ya no está en el alcance, por lo que se produce un error.
Para evitar esto, puede evaluar previamente partes del código para que JMP no tenga una variable para buscar dentro de la fórmula de la columna:
For( j = 3, j <= 10, j = j + 2,
ColLen = Length( Char( Column Name( j ) ) );
ColName = Left( Char( Column Name( j ) ), ColLen - 5 );
NewCol = Substr( ColName, 6 );
Eval( Eval Expr(
New Column( "Delta: " || NewCol, Numeric, Formula( (Column( Expr( j ) ) - Column( Expr( j + 1 ) )) ) );
) )
);
Re: Intento crear una columna y llenarla con una fórmula, pero aparece un error.Es porque Column() es una referencia a la columna misma y no a los valores de la columna.Sé cómo hacer lo que quieres de una manera fea.El siguiente script funcionará mientras tanto hasta que alguien publique una solución más bonita.
Names Default To Here( 1 );
For( j = 3, j <= 10, j = j + 2,
ColLen = Length( Char( Column Name( j ) ) );
ColName = Left( Char( Column Name( j ) ), ColLen - 5 );
NewCol = Substr( ColName, 6 );
Eval(
Parse(
"New Column( \!"Delta: " || NewCol || "\!",
Numeric,
Formula(
:\!"" ||
(Column( j ) << Get Name) || "\!"n - :\!"" || (Column( j + 1 ) << Get Name) || "\!"n
))"
)
);
);
Re: Intento crear una columna y llenarla con una fórmula, pero aparece un error.@mmarchandTSI , Estoy de acuerdo,
Formula(Column( ...
no funcionará
¿Qué hay de usar sustituto:
For( j = 3, j <= 10, j = j + 2,
ColLen = Length( Char( Column Name( j ) ) );
ColName = Left( Char( Column Name( j ) ), ColLen - 5 );
NewCol = Substr( ColName, 6 );
Eval(Substitute(Expr(
New Column( "Delta: " || NewCol, Numeric, Formula( (__colA__ - __colB__) ) );
),Expr(__colA__),Name Expr(As Column(j)),Expr(__colB__),Name Expr(As Column(j+1)) ))
);
Re: Intento crear una columna y llenarla con una fórmula, pero aparece un error.Buen post sobre este tema es Inserte una expresión en otra usando Eval Insert, Eval Expr, Parse y Substitute . En su caso, necesita una solución un poco más complicada, ya que está utilizando índices de columna en lugar de nombres de columna si desea tener fórmulas (la mayoría de las veces sugeriría usar nombres en lugar de índices). La mayoría de las veces uso Eval(EvalInsert()) pero el sustituto también es una buena opción
Names Default To Here(1);
dt = New Table("Untitled",
Add Rows(3),
Compress File When Saved(1),
New Column("Column 1", Numeric, "Continuous", Format("Best", 12), Set Values([1, 2, 3])),
New Column("Column 2", Numeric, "Continuous", Format("Best", 12), Set Values([2, 3, 4])),
New Column("Column 3", Numeric, "Continuous", Format("Best", 12), Set Values([3, 4, 5])),
New Column("Column 4", Numeric, "Continuous", Format("Best", 12), Set Values([4, 5, 6])),
New Column("Column 5", Numeric, "Continuous", Format("Best", 12), Set Values([6, 7, 8]))
);
For(j = 1, j < 5, j = j + 2,
// ColLen = Length(Char(Column Name(j)));
// ColName = Left(Char(Column Name(j)), ColLen - 6);
// NewCol = Substr(ColName, 6);
new_col = Word(2, Column(dt, j) << get name, " ");
Eval(Eval Expr(
New Column("Delta: " || new_col, Numeric, Formula(
Expr(NameExpr(AsColumn(j))) - Expr(NameExpr(AsColumn(j + 1)))
))
));
);
Algunas funciones/mensajes adicionales que pueden ser de su interés: < < Obtener nombres de columnas , Palabra() (busque también Words(), Item() y Items() del índice de secuencias de comandos), Para cada() (si tiene JMP16+)
Re: Intento crear una columna y llenarla con una fórmula, pero aparece un error.Después de trastear un poco
- especialmente: me pregunto por qué el n. ° 1 no da el resultado esperado:
dt = Open( "$Sample_data/iris.jmp" );
cols = {Sepal length,Sepal width, Petal length};
i = 2;
Eval( Eval Expr( dt << New Column( "new1", Formula( As Column( Expr( i ) ) ) ) ) ); //works but the formula is corrupted
Eval( Eval Expr( dt << New Column( "new2", Formula( As Column( Expr( Column(i) ) ) ) ) ) );
Eval( Eval Expr( dt << New Column( "new3", Formula( As Column( Expr( Char( cols[i] ) ) ) ))) );
Eval(Substitute(Expr(dt << New Column( "new4", Formula( __col__ ) )),Expr(__col__),Name Expr(As Column(i)) ));
Eval(Eval Expr(dt << New Column("new5", Formula(Expr(NameExpr(AsColumn(i)))))));
// new:
Eval( Eval Expr( dt << New Column( "new6", Formula( As Column( dt, Expr( i ) ) ) ) ) ); ... Encontré una nueva variante que no necesita el adjunto Nombre Expr. para que funcione.
Interesante ...
Re: Intento crear una columna y llenarla con una fórmula, pero aparece un error.No funciona 
Re: Intento crear una columna y llenarla con una fórmula, pero aparece un error.¡Solo como columna () en lugar de columna funcionó!
Re: Intento crear una columna y llenarla con una fórmula, pero aparece un error.¡Solo como columna () en lugar de columna funcionó!
Re: Intento crear una columna y llenarla con una fórmula, pero aparece un error.Parece funcionar "una vez" (los valores están bien), pero (al menos para mi caso de prueba) la variante n. ° 1 informa un error con la fórmula cuando la abre después:

La variante # 6 parece resolver este problema:

pero definitivamente fallará una vez que Jmp esté cerrado y olvide lo que dt medio ....
Re: Intento crear una columna y llenarla con una fórmula, pero aparece un error.@CoronaDeLágrimas , Basado en su JSL original:
For( j = 3, j <= 10, j = j + 2,
ColLen = Length( Char( Column Name( j ) ) );
ColName = Left( Char( Column Name( j ) ), ColLen - 5 );
NewCol = Substr( ColName, 6 );
Eval(
Eval Expr(
New Column( "Delta: " || NewCol,
Numeric,
Formula( (As Column( Expr( Column Name( j ) ) ) - As Column( Expr( Column Name( j + 1 ) ) )) )
)
)
);
);Me gustan las funciones clean As Column("column name"), y no es feo como mi solución Eval( Parse(...) ).
Re: Intento crear una columna y llenarla con una fórmula, pero aparece un error.Debería haber señalado que para pasar de la referencia de la columna al valor de la fila, simplemente ingrese un [] .Lo siguiente debería funcionar:
For( j = 3, j <= 10, j = j + 2,
ColLen = Length( Char( Column Name( j ) ) );
ColName = Left( Char( Column Name( j ) ), ColLen - 5 );
NewCol = Substr( ColName, 6 );
Eval( Eval Expr(
New Column( "Delta: " || NewCol, Numeric, Formula( (Column( Expr( j ) )[] - Column( Expr( j + 1 ) )[]) ) );
) )
);
Re: Intento crear una columna y llenarla con una fórmula, pero aparece un error.Debería haberlo señalado: para pasar de una referencia de columna a un valor de fila dentro de una fórmula, coloque un [] después de la referencia de columna
Column( 1)[] + Column( 2 )[]
Re: Intento crear una columna y llenarla con una fórmula, pero aparece un error.Buen truco 
Column(1)[]
en lugar de
Column(1)[row()]