Comment JMP évalue-t-il une formule de colonne ?@txnelson vient d'utiliser summary() à l'intérieur comme constante :
https://community.jmp.com/t5/Discussions/Alphabetical-Ranking-of-Nominal-Data/mp/822725/highlight/true#M100245
As Constant( Summarize( theLevels = by( :age ) ) );
Contains( theLevels, Char( :age ) );
Approche très intéressante !
Pour une constante , l'index de script fournit l'exemple
Names Default To Here( 1 );
New Table( "As Constant Demo Table 1",
Add Rows( 10 ),
New Column( "Non-Constant", Formula( Random Uniform() ) ),
New Column( "Constant", Formula( As Constant( Random Uniform() ) ) )
);
this is easy to understand - As Constant( Random Uniform() ) is executed just once and the return value is used for the other rows.
The thing that puzzled me: The return value of Résumer is empty and actually, it's theLevels which we are interested in.
Donc, le véritable truc est
comme constante : "est exécuté une seule fois" !
très utile!
Pourrait être utilisé pour :
as constant("JMP just started to evaluate column xyz");
Utilisons cette astuce pour une autre application : ouvrir une table de données auxiliaires.
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt << New Column( " col",
Formula(
as constant (
dt = Current Data Table();
dtsum = dt << summary( Group( :age, :height ) );
nr = N Rows( dt );
);
Eval( (EvalExpr(myrows= dtsum << get rows where( :age == Expr(dt:age[row()])))));
Print(:age, myrows);
dtsum[myrows, 2]
)
);
Mais ce n'est pas aussi facile que je l'espérais...
Hm, il est assez tard - je n'ai aucune idée pourquoi :

Automatisation et scriptsRe : Comment JMP évalue-t-il une formule de colonne ?La question suivante - et donc le titre du post :
pourquoi JMP supprime les entrées lorsque je ferme dtsum ?
Try(close(dt, nosave));
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Data Table( "Big Class" ) << Sort(
By( :age, :height ),
Replace Table
);
dt << New Column( " col",
Formula(
local({tmp,myAge},
as constant (
dt0 = Current Data Table();
dtsum = dt << summary( Group( :age, :height ) );
//dtsum:age << set name(age2);
nr = N Rows( dt0 );
);
myage = dt:age[row()];
Eval (Eval Expr(myrows = dtsum << get rows where( :age == Expr(myAge))));
Print(myRows);
tmp = contains(dtsum[myrows,2], :height);
if(row()==nr, dt<< runformulas();wait(1);close(dtsum, noSave);Caption("done"));
tmp
)));Re : Comment JMP évalue-t-il une formule de colonne ?Le problème 1 peut être résolu via :
dt << New Column( " col",
Expression,
set each value (
local({tmp,myAge},
as constant (
dt0 = Current Data Table();
dtsum = dt << summary( Group( :age, :height ) );
//dtsum:age << set name(age2);
nr = N Rows( dt0 );
);
myage = dt:age[row()]; // save as variable and use later here ↘:backhand_index_pointing_down:</img>
Eval (Eval Expr(myrows = dtsum << get rows where( :age == Expr(myAge))));
dtsum[myrows,2]
)));Re : Comment JMP évalue-t-il une formule de colonne ?Wow, et le deuxième est très surprenant, il peut être corrigé via
//dense rank - with groupby
dt << New Column( " col",
set each value( // <- the first change is here
local({tmp,myAge},
as constant (
dt = Current Data Table();
dtsum = dt << summary( Group( :age, :height ) );
//dtsum:age << set name(age2);
nr = N Rows( dt );
);
myage = dt:age[row()];
Eval (Eval Expr(myrows = dtsum << get rows where( :age == Expr(myAge))));
tmp = contains(dtsum[myrows,2],dt:height); // <- the second change is here : use dt:height instead of :height to force JMP to use the right table!
if(row()==nr, close(dtsum, noSave));
tmp
)));Cela résout également le problème avec plusieurs entrées « 0 » dans l’approche précédente.
Donc, sous la ligne, la question n'était pas :
pourquoi JMP supprime les valeurs dans dt si la table dtsum est fermée ?
la vraie question était :
pourquoi JMP utilise dtsum:height au lieu de dt:height lors du calcul des entrées pour la table de données dt ?
question ouverte : pourquoi dt:height corrige-t-il simplement le problème pour définir chaque valeur() et pas pour la formule()
Re : Comment JMP évalue-t-il une formule de colonne ?Ah,
dt << New Column( "dense rank_ grouped by",
Character,
formula (
local({tmp,myAge},
as constant (
dt = Current Data Table();
dtsum = dt << summary( Group( :age, :height ) );
//dtsum:age << set name(age2);
nr = N Rows( dt );
);
rw = row();
myage = dt:age[row()];
Eval (Eval Expr(myrows = dtsum << get rows where( dtsum:age == Expr(myAge)))); // <- use dtsum:age !!!
tmp = contains(dtsum[myrows,2], dt:height[rw]); // <- use dt:height !!!!
if(row()==nr, close(dtsum, noSave));
tmp
)));
@jthi , je me souviens, vous avez eu un problème similaire il y a quelque temps - un conflit si deux tables ont des noms de colonnes qui se chevauchent.
J'ajouterai un lien quand je le trouverai...
Re : Comment JMP évalue-t-il une formule de colonne ?Voulez-vous parler du problème que je mentionne ici Bug lors de l'utilisation d'une combinaison de valeurs définies, de tables avec le(s) même(s) nom(s) de colonne(s) et de fonctions statistiques col dans une boucle ?
Re : Comment JMP évalue-t-il une formule de colonne ?Ah, c'est vrai, celui-là.
Donc, ce n'est pas seulement << set each value() qui est affecté - formula() peut également être affecté.
Quelle chance que je n’ai pas pu trouver ton message hier.
Je n'aurais pas osé << définir chaque valeur() après l'avoir lu...
peut-être : pas comme solution de contournement mais comme vérification croisée.
Intéressant : dans mon cas, aucune statistique col n'est impliquée (comme col rank() ).
Peut-être que JMP sait que le code était destiné à en créer un ; )