<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />J'utilise 2 méthodes pour créer des colonnes de formules selon que je sais de combien de variables la formule a besoin
- Expr et substitut sont faciles à lire. La section 1 du code crée plusieurs colonnes de formules pour chaque variable dans une liste pour la moyenne ( var, par var )
- Parse and eval et éventuellement eval insert créent une seule colonne de formule qui nécessite un certain nombre de variables, le nombre et le nom étant définis par la liste de variables.
- Les sections 2a et 2b fonctionnent et sont fonctionnellement équivalentes
- Les sections 2c et 2d ne fonctionnent pas, mais semblent un chemin vers une solution élégante
J'aimerais des idées pour créer de meilleures pratiques et j'apprécierais des recommandations
Noms par défaut à ici( 1 );
n=nttable();
dtnms={} ;
Si(
n==0, dtc=1,
n==1, If(current data table() << get name == "Big Class", dtc=0, dtc=1) , // else
for(ii=1, ii <= n, ii++, insert into(dtnms, data table(ii) << getname));
if(contains(dtnms, "Big Class") > 0, dtc=1, dtc=0);
);
if (dtc,dt = Open( "$SAMPLE_DATA/Big Class.jmp" ), dt = data table("Big Class"));
// Section 1 : Ajouter plusieurs colonnes de formule en entrant dynamiquement des variables.
Form1=expression(
form1col=dt << nouvelle colonne(Nom, formule(col signifie(As Column(YVar), As Column(ByVar))))
);
VarList={"sexe", "taille", "poids"} ;
For(ii=2, ii <= N Items(VarList), ii++,
Eval(Remplacer(Nom expr(form1),
expr(Nom), VarList[ii]||" Moyennes",
expr(YVar), VarListe[ii],
expr(ParVar), VarListe[1],
));
);
// Section 2 : Moyenne des colonnes dans la liste des variables
// Méthode 2a La méthode fonctionne mais est difficile à déboguer
VarList={"taille", "poids", "âge"} ;
Formtxt1 = "formcol = dt << new column(\!"Method a: Mean\!", formula(mean( ";
Formtxt2 = "Comme colonne(\!""||VarList[1]||"\!")" ;
Si(
N Items(VarList)==2, Formtxt2 ||= ", As Column(\!""||VarList[2]||"\!")",
N éléments(VarList)>2, For(ii=2, ii <= N éléments(VarList), ii++,
Formtxt2 ||= ", As Column(\!""||VarList[ii]||"\!")"
)
);
Formtxt=Formtxt1||Formtxt2||");";
eval(parse(Formtxt));
// Méthode 2b : Un peu plus facile à voir
col4=expression(
NewCol1=dt << New Column("Méthode b : Moyenne de "||_names_);
);
form4txt="NouveauCol1 <
VarList={"taille", "poids", "âge"} ;
VarRef = eval list(dt << get Column Reference(VarList));
_Vars_ = "As Column( \!"" || ConCat Items(VarList, "\!"), As Column( \!"") || "\!")";
form4txta = Eval Insérer(form4txt);
Eval(Remplacer(Nom expr(col4),
expr(_names_), concat Items(VarList,"", ",)
));
Eval(Parser(form4txta)); //Parse fait du texte une expr qui est évaluée
// ****************************************** //
// ************* Ca ne fonctionne pas ************* //
//Méthode 2c : Je pense que ce serait la meilleure, mais je ne peux pas la corriger - J'ai toujours une liste
form3=expression(
NewCol=dt << New Column("Moyenne de "||_names_, formula(Mean(_Vars_ )));
);
VarList={"taille", "poids", "âge"} ;
VarRef = eval list(dt << get Column Reference(VarList));
Eval(Remplacer(Nom expr(form3),
expr(_names_), concat Items(VarList,"", ",),
expr(_Vars_), VarRef
));
// Méthode 2d : Utilisation d'une boucle, mais toujours incorrecte
form4=expression(
NewCol=dt << New Column("Moyenne de "||_names_, formula(Mean(_Vars_ )));
);
VarList={"taille", "poids", "âge"} ;
VarRef = eval list(dt << get Column Reference(VarList));
Form4a =Remplacer(Nom expr(form4),
expr(_names_), concat Items(VarList,"", ",)
);
For(ii=1, ii <= N Items(VarList), ii++,
form4a=Remplacer(Nom expr(form4a),
expr(_Vars_), expr(VarRef[ii], _Vars_)
);
);
Eval(Remplacer(Nom expr(form4a),
expr(_Vars_), ""
));
// ****************************************** //
// ************* Ca ne fonctionne pas ************* //
Belle collection de différentes méthodes.
Dernièrement, j'en suis venu à préférer travailler avec des expressions plutôt qu'avec des chaînes dans des cas comme celui-ci. Pour définir une formule par JSL, je construis d'abord l'expression en utilisant EvalExpr(), que j'insère ensuite avec NameExpr() pour éviter l'évaluation au moment de l'exécution.
Vous trouverez ci-dessous deux exemples basés soit sur une liste de noms de colonnes, soit sur une liste de chaînes, cette dernière étant un peu plus difficile.
dt = Ouvrir ( "$SAMPLE_DATA/Grande classe.jmp" ) ;
// 1. Liste des noms de colonnes
L1 = { âge , hauteur , lester } ; // c'est-à-dire dt<
formulaire 1 = Expr éval ( Moyenne ( Expr ( L1 ))) ;
form1col = dt << Nouvelle colonne ( Concater des objets ( Mots ( Carboniser ( L1 ) , "{}," )) || " Moyenne" , formule ( Nom Expr ( formulaire 1 ))) ;
// 2. Liste des chaînes
L2 = { "âge" , "hauteur" , "lester" } ; // c'est-à-dire dt<
formulaire2 = Expr éval (
Moyenne (
Expr (
Répéter (
je = 0 ;
{ je ++ ; Expr éval ( Comme colonne ( Expr ( L2 [ je ])))} ;,
N articles ( L2 )
)
)
)
) ;
form2col = dt << Nouvelle colonne ( Concater des objets ( L2 ) || " Moyenne" , formule ( Nom Expr ( formulaire2 ))) ;