Transposer une table avec des arguments personnalisés<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />J'essaie de transposer une table avec un nom de colonne Label connu, mais transposez des noms de colonne uniquement connus au moment de l'exécution. Cela fait des heures que j'essaie de comprendre comment faire cela, mais JSL confond grandement la tâche en prenant la commande Transpose pour la fonction Transpose de la matrice et l'argument Columns () correspondant à la fonction qui obtient le nom de toutes les colonnes. la table. Dans le code suivant, les colonnes de la liste sont renseignées avec les noms des colonnes que je veux transposer.
// Crée l'expression transposée
transposeExpr = Expr (Transpose (Columns (), Label (: Wt ou Rd))));
// Extrait l'expression de l'argument Columns (cela m'empêche de le créer moi-même et de le confondre avec la fonction Columns ())
columnsExpr = Arg (transposeExpr, 1);
Pour (i = 1, i <= numColumns, i ++,
Insérer dans (columnsExpr, Name Expr (As Column (colNames) )));
)
Supprimer de (transposeExpr, 1);
Insérer dans (transposeExpr, Name Expr (columnsExpr), 1);
cdt = table de données actuelle ();
cdt << Transpose (Nom Expr (columnsExpr), Label (: Wt ou Rd));
Toutefois, cela ne semble toujours pas fonctionner, car columnsExpr donne toujours une liste des noms de toutes les colonnes de la table actuelle, plutôt que l'argument Columns avec des références réelles à la table. (Je pense qu'il interprète ces références sont des arguments de la fonction Columns)
Quelqu'un peut-il s'il vous plaît expliquer ce que je fais mal?
Re: Transposer une table avec des arguments personnalisés1. Transposer (Colonnes () .... ) attend un tas de noms de colonnes séparés par des virgules, comme vous le feriez manuellement. Il n'attend pas le nom d'une liste et ne sait pas comment extraire les informations du nom de la liste contenant les noms de colonnes d'intérêt. La fonction eval comble le fossé. C'est ainsi que je vois le problème, mais quelqu'un d'autre peut avoir une façon plus précise de l'expliquer techniquement.
2 Column () versus As Column: Je ne suis pas sûr de savoir en quoi ils diffèrent. Les exemples courts dans la documentation les rendent interchangeables. Je serais intéressé, quelqu'un peut signaler les différences entre eux.
Re: Transposer une table avec des arguments personnalisésCela semble fonctionner. Je fais ça:
colList = List ();
Pour (i = 1, i <= numColumns, i ++,
Insérer dans (colList, Column (colNames) ));
)
cdt = table de données actuelle ();
cdt << Transpose (Columns (Eval (colList)), Label (: Wt ou Rd));
Pourquoi dois-je appeler Eval sur colList dans le message final? Quelle est la différence entre Column () et As Column ()?
Re: Transposer une table avec des arguments personnalisésJe ne sais pas si je comprends exactement ce que vous voulez faire, mais cet exemple serait peut-être utile, à supposer que les données sur la condition physique soient à jour.
collist = {: Age,: Oxy,: Runtime};
Tableau de données ("Fitness") << Transpose (
colonnes (eval (collist)),
Nom de l'étiquette ),
Tableau de sortie ("Transpose of Fitness")
)
Re: Transposer une table avec des arguments personnalisésLorsque j'ai un problème comme celui-ci, je construis une chaîne de manière dynamique et l'exécute avec eval (parse ()). C'est un peu la force brute, mais je suis lié à toutes les fonctions telles que expr, eval, parse, name expr, etc.
Cela devrait le faire:
transposeStr = "cdt << Transpose (Columns (" ;
Pour ( je = 1 , je <= numColumns , je ++,
transposeStr = transposeStr || ":" || colNames [ je ] || "," ;
) ;
// Enlève la dernière virgule
Clen = longueur ( transposeStr ) ;
transposeStr = sous-sol ( transposeStr , 1 , ( Clen - 2 )) ;
// Ajoute l'argument label
transposeStr = transposeStr || "), Étiquette (: Wt ou Rd))" ;
eval ( analyser ( transposeStr )) ;