Transposición de una tabla con argumentos personalizados.<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Estoy tratando de transponer una tabla con un nombre de columna de Etiqueta conocido, pero Transponer los nombres de columna que solo se conocen en tiempo de ejecución. He intentado durante horas averiguar cómo hacer esto, pero la tarea se complica en gran medida porque JSL confunde el comando Transponer con la función Transpose de la matriz y el argumento Columns () para la función que obtiene los nombres de todas las columnas en la mesa. En el siguiente código, las columnas de la lista se rellenan con los nombres de las columnas que quiero transponer.
// Crear la expresión de transposición
transposeExpr = Expr (Transpose (Columns (), Label (: Wt o Rd)));
// Extraiga la expresión del argumento Columns (esto me impide tener que crearlo yo mismo y confundirlo con la función Columns ())
columnsExpr = Arg (transposeExpr, 1);
Para (i = 1, i <= numColumns, i ++,
Insertar en (columnsExpr, nombre Expr (como columna (colNames) )));
);
Eliminar de (transposeExpr, 1);
Insertar en (transposeExpr, Name Expr (columnsExpr), 1);
cdt = Tabla de datos actuales ();
cdt << Transposición (Nombre Expr (columnas Expr), Etiqueta (: Wt o Rd));
Sin embargo, esto todavía no parece funcionar porque columnsExpr aún se evalúa como una lista de nombres de todas las columnas en la tabla actual, en lugar del argumento Columns con referencias reales a la tabla. (Creo que interpreta que estas referencias son argumentos para la función Columnas)
¿Alguien por favor puede explicar lo que estoy haciendo mal?
Re: Transponer una tabla con argumentos personalizados.1. Transposición (Columnas () .... ) espera un montón de nombres de columna separados por comas, como los completaría manualmente. No espera el nombre de una lista y no sabe cómo extraer la información del nombre de la lista que contiene los nombres de columna de interés. La función eval cierra la brecha. Así es como veo el problema, pero alguien más puede tener una manera más precisa técnicamente de explicarlo.
2. Columna () versus Como columna: No estoy seguro de cómo difieren. Los breves ejemplos en los documentos hacen que parezcan intercambiables en su función. Me interesaría que alguien pueda señalar las diferencias entre ellos.
Re: Transponer una tabla con argumentos personalizados.Esto parece funcionar. Hago esto:
colList = List ();
Para (i = 1, i <= numColumns, i ++,
Insertar en (colList, Columna (colNames) ));
);
cdt = Tabla de datos actuales ();
cdt << Transpose (Columns (Eval (colList)), Label (: Wt o Rd));
¿Por qué tengo que llamar a Eval en colList en el mensaje final? ¿Cuál es la diferencia entre Column () y As Column ()?
Re: Transponer una tabla con argumentos personalizados.No estoy seguro si entiendo exactamente lo que quieres hacer, pero quizás este ejemplo sea útil, asumiendo que los datos de aptitud física son actuales.
collist = {: Age,: Oxy,: Runtime};
Tabla de datos ("Fitness") << Transpose (
columnas (eval (collist)),
Nombre de etiqueta ),
Tabla de salida ("Transpose of Fitness")
)
Re: Transponer una tabla con argumentos personalizados.Cuando tengo problemas como este, recurro a construir una cadena dinámicamente y a ejecutarla con eval (parse ()). Es algo de fuerza bruta, pero me atan en nudos con todas las diversas funciones como expr, eval, parse, nombre expr, etc.
Esto debería hacerlo:
transponer = "cdt << Transpose (Columnas (" ;
por ( yo = 1 , yo <= numColumns , yo ++,
transponer = transponer || ":" || nombres El yo ] || " ;
) ;
// Eliminar la última coma
Clen = longitud ( transponer ) ;
transponer = sustrato ( transponer , 1 , ( Clen - 2 )) ;
// Añadir el argumento de la etiqueta
transponer = transponer || "), Etiqueta (: Wt o Rd))" ;
evaluar ( analizar gramaticalmente ( transponer )) ;