<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />On me pose souvent la question de savoir comment créer un script pour une formule (appliquer la même formule à plusieurs colonnes, en utilisant quelque chose concernant la colonne de référence dans la formule). Il s'agit généralement d'un point d'entrée permettant aux utilisateurs de commencer à écrire des scripts, ils sont donc novices.
J'ai récemment posté une question dans la section de discussion régulière, essayant à la fois d'amener mon client à participer (il ne l'a pas fait) et de donner des conseils d'experts (quiconque lit ceci). J'aimerais vraiment générer une réponse solide que je pourrais indiquer aux gens lorsque cette question se posera. Par exemple, la réponse suggérée est-elle vraiment la meilleure façon de procéder si vous avez plus de 1 000 colonnes, etc. ?
Toute aide à ce sujet serait appréciée. Ou une entrée de blog. Ou en soulignant que cela a été traité ailleurs ?
La discussion régulière est ici :
La meilleure façon de scripter une formule de colonne dans plusieurs colonnes ?
Merci!
Dans la continuité du précédent : vous remarquerez que j'utilise la fonction :Name() pour les noms de colonnes. Cela permet d'éviter tout problème lié à la présence de caractères intéressants dans les noms de colonnes. Pas toujours nécessaire, mais encore une fois, à l’épreuve des balles.
Pour faire suite à ce que Don a dit, je me retrouve souvent à aller plus loin, en utilisant Eval(Parse(Substitute())).
Il s’agit en fait d’écrire le code de manière dynamique. Bien qu’un peu inélégant, il est presque à l’épreuve des balles. Cette construction n'est pas toujours la plus efficace (en raison des substitutions de personnages), mais c'est celle qui réussit lorsque toutes les autres astuces échouent, il est donc bon de la connaître. L'inconvénient le plus important est que vous ne pouvez pas voir le code couleur à cause des citations :
Noms par défaut ici ( 1 ) ;
dt = ouvrir ( "$Sample_Data/football.jmp" ) ;
codeFrag = "\[
Nouvelle colonne( "_colName_ Rang à partir de la moyenne",
Numérique,
"Continu",
Format( "Meilleur", 12 ),
Formule( Col Rank( Abs( Col Mean( :Name( "_colName_" )) - :Name( "_colName_" ) ) ) )
)
]\" ;
colListe = dt << obtenir les noms de colonnes ( chaîne ) ;
pour ( je = 1 , je <= articles ( Colliste ) , je ++,
si ( colonne ( dt , colListe [ je ]) << obtenir le type de modélisation == "Continu" ,
évaluer ( analyser ( remplaçant ( codeFrag , "_colName_" , colListe [ je ])))
)
) ;
Si le manque de codage couleur vous dérange, vous pouvez le conserver en enveloppant la chaîne dans une construction char(nameexpr()), comme ci-dessous. Cela ajoute de la complexité, mais cela peut en valoir la peine lors de l'écriture du code à des fins de débogage... une fois que cela fonctionne, vous pouvez toujours supprimer le morceau char(nameexpr()) et le placer entre guillemets en utilisant "\[ ]\".
En fin de compte : cela ne gagnera pas un concours de beauté, mais lorsque vous écrivez la chaîne vous-même, l'analysez et l'évaluez, vous obtiendrez ce que vous recherchez. Gardez-le dans votre poche arrière lorsque Eval(EvalExpr( ...... Expr() .... )) échoue et vous n'êtes pas en mesure de comprendre (ou vous n'avez pas le temps de comprendre, ou vous vous en fichez) pourquoi.
Noms par défaut ici ( 1 ) ;
dt = ouvrir ( "$Sample_Data/football.jmp" ) ;
codeFrag = carboniser ( nomexpr (
Nouvelle colonne ( "_colName_ Rang à partir de la moyenne" ,
Numérique ,
"Continu" ,
Format ( "Meilleur" , 12 ) ,
Formule ( Rang du colonel ( Abdos ( Col moyen ( : Nom ( "_colName_" )) - : Nom ( "_colName_" ) ) ) )
)
)) ;
colListe = dt << obtenir les noms de colonnes ( chaîne ) ;
pour ( je = 1 , je <= articles ( Colliste ) , je ++,
si ( colonne ( dt , colListe [ je ]) << obtenir le type de modélisation == "Continu" ,
évaluer ( analyser ( remplaçant ( codeFrag , "_colName_" , colListe [ je ])))
)
) ;
Acclamations,
Brady
Laura,
Je pense que la réponse donnée dans le Forum est une approche solide qui ne complique pas le code plus qu'il ne le devrait. Je pense que l'utilisation de Expr et Name Expr est inévitable dans cette situation. Dans une prochaine étape, vous pourriez envisager de supprimer la formule de la boucle pour rendre le code plus générique. De cette façon, vous pouvez créer une fonction qui prend des formules comme argument (voir JSL ci-joint). Il existe probablement un moyen plus simple de procéder, mais je suis tellement habitué à utiliser Substitute (et il est extrêmement robuste). Je ne sais pas pourquoi la partie [Row()] est nécessaire, mais c'est à chaque fois que vous faites référence à une colonne, sauf dans une fonction de colonne statistique. J'espère que cela donne un aperçu.
Enfiler