Wie wertet JMP eine Spaltenformel aus?@txnelson hat einfach summary() als Konstante verwendet:
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 ) );
Sehr interessanter Ansatz!
Für als Konstante bietet der Skriptindex das Beispiel
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 Zusammenfassen is empty and actually, it's theLevels which we are interested in.
Der eigentliche Trick ist also
als Konstante : "wird nur einmal ausgeführt" !
sehr nützlich!
Könnte verwendet werden für:
as constant("JMP just started to evaluate column xyz");
Lassen Sie uns diesen Trick für eine andere Anwendung verwenden: zum Öffnen einer zusätzlichen Datentabelle.
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]
)
);
Aber es ist nicht so einfach, wie ich dachte …
Hm, es ist ziemlich spät - ich habe keine Ahnung warum:

Automatisierung und SkriptingBetreff: Wie wertet JMP eine Spaltenformel aus?Die nächste Frage – und daher der Titel des Beitrags:
warum löscht JMP die Einträge, wenn ich dtsum schließe?
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
)));Betreff: Wie wertet JMP eine Spaltenformel aus?Problem 1 kann wie folgt behoben werden:
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]
)));Betreff: Wie wertet JMP eine Spaltenformel aus?Wow, und das zweite ist sehr überraschend, es kann behoben werden über
//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
)));Dies behebt auch das Problem mit mehreren „0“-Einträgen im vorherigen Ansatz.
Unterm Strich lautete die Frage also nicht:
warum löscht JMP die Werte in dt, wenn die Tabelle dtsum geschlossen ist?
die eigentliche Frage war:
warum verwendet JMP beim Berechnen von Einträgen für die Datentabelle dt dtsum:height statt dt:height ?
offene Frage: Warum behebt dt:height das Problem nur für set each value() und nicht für formula()?
Betreff: Wie wertet JMP eine Spaltenformel aus?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 , ich erinnere mich, dass Sie vor einiger Zeit ein ähnliches Problem hatten – einen Konflikt, wenn zwei Tabellen überlappende Spaltennamen haben.
Ich werde einen Link hinzufügen, wenn ich ihn finde ...
Betreff: Wie wertet JMP eine Spaltenformel aus?Meinen Sie das hier von mir erwähnte Problem , einen Fehler bei der Verwendung einer Kombination aus „Jeden Wert festlegen“, Tabellen mit denselben Spaltennamen und statistischen Spaltenfunktionen innerhalb einer Schleife ?
Betreff: Wie wertet JMP eine Spaltenformel aus?Ah, richtig, dieses hier.
Daher ist nicht nur << set each value() betroffen – auch formula() kann betroffen sein.
Was für ein Glück, dass ich deinen Beitrag gestern nicht finden konnte.
Ich hätte mich nach dem Lesen nicht getraut , << set each value() auszuführen ...
vielleicht: nicht als Workaround, sondern als Gegenprobe.
Interessant: In meinem Fall ist keine Col-Statistik beteiligt (wie col rank() ).
Vielleicht weiß JMP, dass der Code dazu gedacht war, einen zu erstellen 