J'ai besoin d'une boucle JSL qui recherchera les en-têtes de colonnes d'une table de données, et si l'en-tête de colonne contient "(rad)", j'aimerais multiplier toutes les valeurs de cette colonne par 180/pi, puis changer "(rad)" en "(deg)" dans l'en-tête de colonne.
J'ai essayé tout ce à quoi je pouvais penser - y compris chatGPT - mais jusqu'à présent sans succès.
- Obtenir toutes les colonnes en utilisant << Obtenir les noms des colonnes
- Configurer le tableau pour qu'il ne soit pas mis à jour en utilisant << commencer la mise à jour des données
- Faites une boucle dessus en utilisant For Each
- Vérifiez si leur nom contient (rad) en utilisant Contient / Commence par / Se termine par
- Utilisez For Each Row pour effectuer une boucle dessus et changer les valeurs en degrés
- J'espère qu'il existe une meilleure méthode pour cela, mais je ne suis pas sûr qu'il y en ait vraiment à moins que vous ne souhaitiez créer de nouvelles colonnes et supprimer les anciennes, car nous ne devrions pas utiliser << définir chaque valeur, ce qui rend cela extrêmement facile à faire et à lire.
- Appliquer la formule sur place (ajoutée dans JMP18) peut fonctionner, mais il est difficile de comprendre comment l'utiliser
- L'utilisation de valeurs matricielles est une bonne option, mais For Each Row fonctionnera toujours, c'est toujours une bonne idée de l'apprendre
- Utilisez substitute et << Set Name pour renommer la colonne
- laisser la table se mettre à jour à nouveau en utilisant << terminer la mise à jour des données
Names Default To Here(1);
dt = New Table("Untitled",
Add Rows(2),
Compress File When Saved(1),
New Column("Column 1", Numeric, "Continuous", Format("Best", 12), Set Values([., .])),
New Column("a (rad)", Numeric, "Continuous", Format("Best", 12), Set Values([1, .]))
);
colnames = dt << Get Column Names(Continuos, "String");
dt << Begin Data Update();
For Each({colname}, colnames,
If(Contains(colname, "(rad)"),
For Each Row(dt, Column(dt, colname)[] = Column(dt, colname)[] * 180 / Pi());
Column(dt, colname) << Set Name(Substitute(colname, "(rad)", "(deg)"));
)
);
dt << End Data Update();
Write();
Toujours impressionnant, merci !
Quelques questions complémentaires :
- Pourquoi « colname » est-il entre accolades comme premier argument de la boucle for each ?
- J'essayais de faire quelque chose comme "dt:colname[rowIdx] = dt:colname[rowIdx] * 180/Pi()" -- comment JMP interpréterait-il cette ligne et pourquoi est-ce faux ?
- À quoi sert le « [] » à la fin de « Column(dt,colname)[] » ? Existe-t-il une section de la documentation qui traite de cette construction ?
Merci encore !