JMP は列の式をどのように評価しますか?@txnelson は、内部でsummary() を定数として使用しました:
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 ) );
とても興味深いアプローチですね!
定数として、スクリプトインデックスは例を提供します
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 要約する is empty and actually, it's theLevels which we are interested in.
実際の秘訣は
定数として: 「一度だけ実行されます」 !
とても便利です!
次のような用途に使用できます:
as constant("JMP just started to evaluate column xyz");
このトリックを別のアプリケーションに使用して、補助データ テーブルを開いてみましょう。
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]
)
);
しかし、思ったほど簡単ではありませんでした...。
うーん、かなり遅いですね。理由はわかりませんが:

自動化とスクリプトRe: JMP は列の式をどのように評価しますか?次の質問、つまりこの投稿のタイトルは次のとおりです。
dtsum を閉じると JMP がエントリを削除するのはなぜですか?
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: JMP は列の式をどのように評価しますか?問題 1 は次の方法で修正できます。
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: JMP は列の式をどのように評価しますか?2つ目はとても驚きましたが、これは
//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
)));これにより、以前のアプローチで発生したいくつかの「0」エントリの問題も修正されます。
つまり、その行の下にある質問は次の通りでした。
テーブル dtsum が閉じられている場合、JMP が dt 内の値を削除するのはなぜですか?
実際の質問は次のとおりです。
JMP がデータ テーブルdtのエントリを計算するときに、 dt: height ではなく dtsum: height を使用するのはなぜですか?
未解決の質問: dt:height はなぜset each value()の問題だけを修正し、 formula() の問題は修正しないのでしょうか?
Re: JMP は列の式をどのように評価しますか?ああ、
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 、少し前にも似たような問題があったのを覚えています。2 つのテーブルに重複する列名がある場合に競合が発生する問題です。
見つけたらリンクを追加します...
Re: JMP は列の式をどのように評価しますか?ここで言及している問題、つまり、ループ内で各値の設定、同じ列名を持つテーブル、および列統計関数の組み合わせを使用する場合のバグのことを指していますか?
Re: JMP は列の式をどのように評価しますか?ああ、そうだ、これ。
したがって、影響を受けるのは<< set each value()だけではなく、 formula()も影響を受ける可能性があります。
昨日あなたの投稿を見つけられなかったのは幸運でした。
これを読んだ後では、あえて<< set each value()しようとは思わなかったでしょう...
おそらく: 回避策としてではなく、クロスチェックとして。
興味深いことに、私の場合、col 統計は関係ありません ( col rank()など)。
おそらく JMP は、コードがそれを作成することを意図していたことを認識しています ; )