ユーザーの選択に応じて更新される対話型ウィンドウのスクリプト作成に役立ちます親愛なるみんな、
組織内のユーザーに展開されるスクリプトを作成して、ディストリビューション プラットフォームを呼び出さなくてもユーザーの簡単な統計情報を実行できるようにしています。 以下のスクリプトには、私が現在持っているもののスクリーンショットと、私が問題を抱えているもののリストがあります。 ユーザーは JMP 16.1 を実行し、私は JMP Pro 16.0 を実行しています。 すべてのマシンは Windows 10、64 ビット マシンです。
スクリプトの意図した目的は、数値列を表示することです (おそらく後でカテゴリ列を扱います)。どのラジオ ボタンが選択されているかに応じて、いくつかの簡単な統計を実行し、統計というラベルの付いた列を使用して同じウィンドウに結果を表示します。計算された統計の種類と、その計算の結果の値。 [結果] パネル ボックスは、[列の選択] パネル ボックスで適切な列を選択した後、ラジオ ボタンを選択すると更新されます。
現在の JMP スクリプト (参考までに、おなじみの Big Class.jmp ファイルでテストしています):
Names Default To Here( 1 );
//Clear Symbols();
//the width of the column list box in pixels
lbWidth = 100;
dt = Current Data Table();
//List of statistics to calculate
StatsListA = {"Mean", "Std Dev", "Max", "Min", "Range", "N"};
StatsListB = {"95% quantile", "50% quantile", "5% quantile"};
StatsListC = {};
//Expression to do math
MathA = Expr(
response_col = Column( dt, Eval( Eval Expr( Expr( ycols ) ) ) );
ymean = Col Mean( response_col );
ystdev = Col Std Dev( response_col );
ymin = Col Min( response_col );
ymax = Col Max( response_col );
yrange = ymax - ymin;
yN = Col Number( response_col );
NumResultsA = {ymean, ystdev, ymin, ymax, yrange, yN};
);
//Expresseion for other math
MathB = Expr(
);
ValueDlg = Expr(
nwin = New Window( "GUI for quick stats",
<<RETURN result=""></RETURN>
これは私がこれまでに持っているものです:

ここに私が問題を抱えているもののリストがあります:
- Radio Box() の呼び出しは、計算される統計を実際にリストする代わりに、ローカル変数名「StatsListA」などをリストします。 たとえば、最初のラジオ ボタンの背後には、Mean、Std Dev、Max、Min、Range、N のリストが必要です。これは、StatsListB と StatsListC にも必要です (C リストはまだ定義していません)。 JSLコードの先頭で作成した定義済みリストを評価する方法がわかりません。 リスト内の項目を変更したい場合があるため、すべての項目を書き出す必要はなく、Radio Box() 呼び出しを毎回編集するよりもローカル変数 StatsListX を変更する方が簡単です。
- 今のところ、すべての列をリストするのではなく、数値だけをリストしたいと思います。 Col List Box() のオプションを All から Numeric ("" の有無にかかわらず) に変更すると、列の空のリストが表示されます。 そのオプションが定義されているときに数値列のみをリストする必要があるのに、なぜこれが起こっているのかわかりません。
- これは私が考える最も難しいものです: 前に述べたように、パネルボックスの「結果」の結果を、左側の「統計」の列で更新したいと思います (これには、StatsListX からの統計とそれらの計算結果がリストされます)。右側の列「値」の統計。 これは、ラジオ ボタンをクリックするたびに更新する必要があります。 したがって、最初は :height を見ていたが、:weight を見たい場合は、:weight を選択し、ラジオ ボタンの 1 つをクリックして、関連する統計の概要を取得します。 ここに示されている Set Function の例に従ってみましたが、うまくいきませんでした (Set Function の呼び出しについてはよくわかりません)。

MathA の Expr() は、元のウィンドウを閉じて新しいウィンドウを開いて結果を表示することによって呼び出されることを意図していましたが、JMP ディスカッションでさらに調査を行った後、既存のウィンドウ内のフィールドを更新できることがわかりました。私がこの問題にアプローチする方法です。 したがって、コードの先頭にある元のコーディングは、私が意図するものに適したコードではないことを知っています。
これに関するヘルプは大歓迎です。
ありがとう!、
DS
スクリプティングRe: ユーザーの選択に応じて更新される対話型ウィンドウのスクリプト作成のヘルプこれはとてもきれいです。 この議論に感謝します。
Re: ユーザーの選択に応じて更新される対話型ウィンドウのスクリプト作成のヘルプこんにちは、みんな、
継続的に提案された変更に感謝します。 私はスクリプトにいくつかの変更を加えましたが、最新の修正版の方が気に入っているので、他の人の貢献に本当に感謝しています。 更新されたスクリプトは、この返信の最後に掲載されます。 この新しいスクリプトは、文字データ型の要約統計も提供します。 また、パネルのレイアウトを少し変更しました。
@jthi 、 あなたの提案はとても良かったと思います。 結果統計の色付きのヘッダー名が気に入っています。 また、似たようなもの@ErraticAttack彼らのコードにあったので、新しい列を選択するか、新しい数値結果を選択すると統計が更新されるようにしました。 Big Class.jmp データ テーブルのように、多くのレベルが存在する可能性があるため、キャラクターの統計結果の縦方向のサイズを変更できるようにしました。 その列タイプに変更すると、カテゴリー統計も更新されますが、文字列が選択されているときに誰かが数値統計オプションをクリックすると、エラーがスローされます。 ウィンドウが幅のサイズを変更し続けないように、幅の提案を保持しました。 ごめん@ErraticAttack 、この時点では、新しい名前空間の定義と、コードの変更方法についてあまり詳しくありません。 それは非常に便利で、物事に取り組むための良い方法に見えます。私はそれを正しく行う方法を学ぶ必要があるだけです.
これを改善する方法、特に美学については、他にも提案があると思います。 もしそうなら、投稿してください。ただし、このディスカッションに更新があったことがわかるように、必ず私にタグを付けてください。 提案された改善をありがとうございました。
ありがとう!、
DS
以下
//GUI for quickly reporting statistics written by D. Schmidt, ver1.5
//Thanks to JMP User community members: jthi, ian_jmp, and ErraticAttach for helpful suggested changes.
Names Default To Here( 1 );
Clear Symbols();
//the width of the column list box in pixels
lbWidth = 217;
dt = Current Data Table();
//dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
//List of statistics to calculate
StatsList1 = {"µ", "σ", "Max", "Min", "Range(Δ)", "N"};
StatsList2 = {"Quantiles", "5%", "25%", "50%", "75%", "95%"};
StatsList3 = {"N", "N Missing", "N 0", "Prop 0", "Prop non-0"};
maxStatCount = Max( N Items( StatsList1 ), N Items( StatsList2 ), N Items( StatsList3 ) );
//RadioBox() arguments
rbArg = Eval List( {Concat Items( StatsList1, ", " ), Concat Items( StatsList2, ", " ), Concat Items( StatsList3, ", " )} );
rbcArg = {"Select for categorical columns"};
//Statistics to Calculate
statMean = Expr( Col Mean( tempCol ) );
statStd = Expr( Col Std Dev( tempCol ) );
statMax = Expr( Col Max( tempCol ) );
statMin = Expr( Col Min( tempCol ) );
statRange = Expr(
Col Max( tempCol ) - Col Min( tempCol )
);
statN = Expr( Col Number( tempCol ) );
statQ95 = Expr(
Col Quantile( tempCol, 0.05 )
);
statQ75 = Expr(
Col Quantile( tempCol, 0.25 )
);
statQ50 = Expr(
Col Quantile( tempCol, 0.5 )
);
statQ25 = Expr(
Col Quantile( tempCol, 0.75 )
);
statQ5 = Expr(
Col Quantile( tempCol, 0.95 )
);
statMiss = Expr(
Col N Missing( tempCol )
);
statZero = Expr(
N Items( Loc( tempCol << get as matrix, 0 ) )
);
statProp0 = Expr( statZero / statN );
statPropn0 = Expr( 1 - statProp0 );
CatStats = Expr(
coltype = tempCol << Get Data type;
If( coltype == "Character",
catdist = dt << Distribution( Nominal Distribution( Column( tempCol ) ), Invisible );
rpt_catdist = catdist << Report;
lvl = rpt_catdist[String Col Box( 1 )] << Get;
Count = rpt_catdist[Number Col Box( 1 )] << Get;
Prob = rpt_catdist[Number Col Box( 2 )] << Get;
SummNMiss = rpt_catdist[List Box( 7 )][2] << Get Text;
SummLvl = rpt_catdist[List Box( 8 )][1] << Get text;
numNMiss = Num( SummNMiss );
numLvl = Num( SummLvl );
catdist << Close Window;
);
Insert Into( lvl, {"N Missing", "N Levels"} );
Insert Into( Count, numNMiss );
Insert Into( Count, numLvl );
);
//List for results
StatList = Eval List( {StatsList1, StatsList2, StatsList3} );
StatListRes1 = Expr(
Eval List( {statMean, statStd, statMax, statMin, statRange, statN} )
);
StatListRes2 = Expr(
Eval List( {., statQ95, statQ75, statQ50, statQ25, statQ5} )
);
StatListRes3 = Expr(
Eval List( {statN, statMiss, statZero, statProp0, statPropn0} )
);
StatListRes = Expr(
Eval List( {StatListRes1, StatListRes2, StatListRes3} )
);
//User window
ValueDlg = Expr(
nwin = New Window( "GUI for quick stats",
<<RETURN result=""></RETURN>
Re: ユーザーの選択に応じて更新される対話型ウィンドウのスクリプト作成のヘルプやあ@ジムローリン、
それは単なるデバッグコードだったと思います@jthi私が投稿した元のコードに彼の提案された編集を提供するときに使用していました。 このスレッドに書いた他の人からの提案された編集を考慮に入れた更新版を投稿しています。 更新されたスクリプトを投稿するときにタグを付けます。 Big Class.jmp データ テーブルで問題なく動作しています。
ありがとう!、
DS
Re: ユーザーの選択に応じて更新される対話型ウィンドウのスクリプト作成のヘルプここに私の 2 セントを投入します。多くの場合、スクリプトを論理的に分離されたユニットまたは機能にできるだけ分離することが最善です。そのためには、表示ツリーからロジックを削除し、関数定義を可能な限り平坦化する方がはるかに優れていると思います。
以下のソリューション例では、すべての関数のスコープが自己名前空間と、各関数の最初の行のスコープが自己名前空間。実際には、これを自動的に行うメタプログラミング ラッパーを作成して、明示的に定義する必要がないようにしました。自己名前空間または含む自己 = 名前空間 (「名前」)行を各関数の最初の引数として指定します。多くの対話型 GUI を作成する場合は、作業を大幅に節約できるので、似たようなことをしたいと思うかもしれません。これには、スクリプトをEval( Eval Expr( "<コード>" ) )ブロック。
また、このルートをたどる場合は、直接呼び出すことができるビルトインディスプレイボックスのラッパーを作成するのが最も簡単だと思います自己関数内にボイラープレートをそれほど多く配置する必要はありません<< Set Function()メッセージ。
/* quick stats */
self = New Namespace();
self:tool name = "Quick Stats";
Eval( Eval Expr(
self:initialize = Function( {}, // called before the display tree is generated
self = Namespace( Expr( self << Get Name ) );
self:table = Current Data Table();
self:radio inputs = {
"Mean, Std Dev, Max, Min, Range, N",
"Quantiles: 0.05, 0.25, 0.50, 0.75, 0.95",
"N, N Missing, N Zero, Prop 0, Prop non-0"
};
self:stat list = {
{"Mean", "Std Dev", "Max", "Min", "Range", "N"},
{"5%", "25%", "50%", "75%", "95%"},
{"N", "N Missing", "N Zero", "Prop 0", "Prop non-0"}
};
1
);
self:content = Function( {}, // holds the display tree
self = Namespace( Expr( self << Get Name ) );
self:container = H Splitter Box(
V List Box(
H List Box(
Lineup Box( N Col( 1 ), Spacing( 0 ),
Spacer Box( <<SET auto="" stretching=""></SET>self:window << Update Window;
self:finalize();
) );
self << Get Name;
Re: ユーザーの選択に応じて更新される対話型ウィンドウのスクリプト作成のヘルプstatsstart.jcl を実行すると、次のエラーが表示されます。
名前未解決: 'tempCol' へのアクセスまたは評価での tempCol{1}、tempCol/*####*/
おそらく、v13.2.1 を実行しているからでしょうか?
Re: ユーザーの選択に応じて更新される対話型ウィンドウのスクリプト作成のヘルプスクリプトがほぼ思いどおりに動作するようになったら、視覚的に考慮すべきことがいくつかあります。
- テーブルのサイズが変更され、ウィンドウが少し「跳ね返る」
- ユーザーが列を選択していない場合、エラーが発生します
- データテーブルが開いていない場合は、スクリプトの実行を停止してユーザーに通知できます
- ユーザーが列リスト ボックスの列を変更した場合は、ラジオ ボックスの現在の選択で統計を再計算するか、テーブルを空に設定する必要があります。
いくつかのアイデア:
- 結果パネルボックス用。 幅の設定を使用して、テーブルの水平サイズが変更されないようにし、事前定義されたリスト サイズの非表示のプレースホルダー String Col Box を使用して、垂直サイズの変更を防ぐことができます。
- [列] パネル ボックスを選択します。 Max Selected(1) を追加して、ユーザーが複数の列を選択できないようにすることができます。
- [クイック統計] パネル ボックスを選択します。 ユーザーが列を選択していない場合のある種の「エラー処理」。
いくつかの変更を加えた完全なスクリプト:
もっと見る...Names Default To Here( 1 );
//Clear Symbols(); //dont like using this
If(N Items(Get Data Table List()) == 0,
Throw("No datatables open. Stopping...");
stop();
);
//the width of the column list box in pixels
lbWidth = 205;
dt = Current Data Table();
//dt = Open("$SAMPLE_DATA/Big Class.jmp");
//List of statistics to calculate
StatsList1 = {"Mean", "Std Dev", "Max", "Min", "Range", "N"};
StatsList2 = {"Quantiles", "5%", "25%", "50%", "75%", "95%"};
StatsList3 = {"N", "N Missing", "N Zero", "Prop 0", "Prop non-0"};
maxStatCount = Max(N Items(StatsList1), N Items(StatsList2), N Items(StatsList3));
//Statistics to Calculate
statMean = Expr( Col Mean( tempCol ) );
statStd = Expr( Col Std Dev( tempCol ) );
statMax = Expr( Col Max( tempCol ) );
statMin = Expr( Col Min( tempCol ) );
statRange = Expr(
Col Max( tempCol ) - Col Min( tempCol )
);
statN = Expr( Col Number( tempCol ) );
statQ95 = Expr(
Col Quantile( tempCol, 0.05 )
);
statQ75 = Expr(
Col Quantile( tempCol, 0.25 )
);
statQ50 = Expr(
Col Quantile( tempCol, 0.5 )
);
statQ25 = Expr(
Col Quantile( tempCol, 0.75 )
);
statQ5 = Expr(
Col Quantile( tempCol, 0.95 )
);
statMiss = Expr(
Col N Missing( tempCol )
);
statZero = Expr(
N Items( Loc( tempCol << get as matrix, 0 ) )
);
statProp0 = Expr( statZero / statN );
statPropn0 = Expr( 1 - statProp0 );
//RadioBox() argument
rbArg = Eval List( {Concat Items( StatsList1, ", " ), Concat Items( StatsList2, ", " ), Concat Items( StatsList3, ", " )} );
//List for results
StatList = Eval List( {StatsList1, StatsList2, StatsList3} );
StatListRes1 = Expr(
Eval List( {statMean, statStd, statMax, statMin, statRange, statN} )
);
StatListRes2 = Expr(
Eval List( {., statQ95, statQ75, statQ50, statQ25, statQ5} )
);
StatListRes3 = Expr(
Eval List( {statN, statMiss, statZero, statProp0, statPropn0} )
);
StatListRes = Expr(
Eval List( {StatListRes1, StatListRes2, StatListRes3} )
);
//User window
ValueDlg = Expr(
nwin = New Window( "GUI for quick stats",
<<RETURN result=""></RETURN>
Re: ユーザーの選択に応じて更新される対話型ウィンドウのスクリプト作成のヘルプやあ@jthiと@ian_jmp 、
お二方、大変お世話になりました! 最後の 2 つのヒントをありがとう@jthi 、 連想配列のアルファベット順の「問題」を克服できました。 私は AA の力が好きです。どこで役立つかはわかりますが、ユーザーのために一定の秩序を維持する必要があります。
リストの提案と、私が抱えていたカウントゼロの問題に対するあなたの提案で変更を加えることができました. ありがとう! コードは期待どおりに機能しています。次に、カテゴリ列を実行するためにコードを拡張し、ユーザーを調査して、必要な統計の実際のリストを確認する必要があります。
あなたのご親切に感謝します! 作業コード (少なくとも数値列の場合) は以下のとおりです。
ありがとう!、
DS
Names Default To Here( 1 );
Clear Symbols();
//the width of the column list box in pixels
lbWidth = 205;
dt = Current Data Table();
//dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
//List of statistics to calculate
StatsList1 = {"Mean", "Std Dev", "Max", "Min", "Range", "N"};
StatsList2 = {"Quantiles", "5%", "25%", "50%", "75%", "95%"};
StatsList3 = {"N", "N Missing", "N Zero", "Prop 0", "Prop non-0"};
//Statistics to Calculate
statMean = Expr( Col Mean( tempCol ) );
statStd = Expr( Col Std Dev( tempCol ) );
statMax = Expr( Col Max( tempCol ) );
statMin = Expr( Col Min( tempCol ) );
statRange = Expr(
Col Max( tempCol ) - Col Min( tempCol )
);
statN = Expr( Col Number( tempCol ) );
statQ95 = Expr(
Col Quantile( tempCol, 0.05 )
);
statQ75 = Expr(
Col Quantile( tempCol, 0.25 )
);
statQ50 = Expr(
Col Quantile( tempCol, 0.5 )
);
statQ25 = Expr(
Col Quantile( tempCol, 0.75 )
);
statQ5 = Expr(
Col Quantile( tempCol, 0.95 )
);
statMiss = Expr(
Col N Missing( tempCol )
);
statZero = Expr(
N Items( Loc( tempCol << get as matrix, 0 ) )
);
statProp0 = Expr( statZero / statN );
statPropn0 = Expr( 1 - statProp0 );
//RadioBox() argument
rbArg = Eval List( {Concat Items( StatsList1, ", " ), Concat Items( StatsList2, ", " ), Concat Items( StatsList3, ", " )} );
//List for results
StatList = Eval List( {StatsList1, StatsList2, StatsList3} );
StatListRes1 = Expr(
Eval List( {statMean, statStd, statMax, statMin, statRange, statN} )
);
StatListRes2 = Expr(
Eval List( {., statQ95, statQ75, statQ50, statQ25, statQ5} )
);
StatListRes3 = Expr(
Eval List( {statN, statMiss, statZero, statProp0, statPropn0} )
);
StatListRes = Expr(
Eval List( {StatListRes1, StatListRes2, StatListRes3} )
);
//User window
ValueDlg = Expr(
nwin = New Window( "GUI for quick stats",
<<RETURN result=""></RETURN>Re: ユーザーの選択に応じて更新される対話型ウィンドウのスクリプト作成のヘルプ1.連想配列を使用しているため、統計は並べ替えられます。 リストを使用し、参照を変更してインデックスを使用することもできます
2. 0 値の計算方法を変更するとうまくいく場合があります。 たとえば、N Items() で Loc() の例を使用できます。
statZero = Expr(N Items(Loc(tempCol << get as matrix, 0)));

Re: ユーザーの選択に応じて更新される対話型ウィンドウのスクリプト作成のヘルプやあ@jthiと@ian_jmp 、
お二人様、早速のご感想ありがとうございます! あなたの提案はうまく機能し、私はより多くの進歩を遂げることができました. 現在、おそらく非常に単純な 2 つの点で問題が発生しています。以下の更新されたコードを含めます。 参考までに、:height のいくつかの値を削除し、:height にいくつかのゼロを追加してテストしました
問題:
- 統計をリストするとき、アルファベット順に表示されます。リストで定義した順序を維持したいのですが、可能ですか?
- 最初にゼロの数を数えて、ゼロと非ゼロの比率を計算しようとしています。 残念ながら、それはまったく正しく機能していません。 Expr() 内に要約を入れることはできますが、連想配列を定義することができず、その後の正しい計算が得られません。 これを行う簡単な方法があると確信していますが、ゼロのみをカウントするための直接コマンドがJSLに見つかりませんでした。 5 つの欠損値と 7 つのゼロ値を手動で入力しました。 したがって、prop-non-zero は 0.8、prop-zero は 0.2 にする必要があります。
Names Default To Here( 1 );
Clear Symbols();
//the width of the column list box in pixels
lbWidth = 205;
dt = Current Data Table();
//dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
//List of statistics to calculate
StatsListA = {"Mean", "Std Dev", "Max", "Min", "Range", "N"};
StatsListB = {"Quantiles", "5%", "25%", "50%", "75%", "95%"};
StatsListC = {"N", "N Missing", "N Zero", "Prop 0", "Prop non-0"};
//RadioBox() argument
rbArg = Eval List( {Concat Items( StatsListA, ", " ), Concat Items( StatsListB, ", " ), Concat Items( StatsListC, ", " )} );
//Statistics to Calculate
statMean = Expr( Col Mean( tempCol ) );
statStd = Expr( Col Std Dev( tempCol ) );
statMax = Expr( Col Max( tempCol ) );
statMin = Expr( Col Min( tempCol ) );
statRange = Expr(
Col Max( tempCol ) - Col Min( tempCol )
);
statN = Expr( Col Number( tempCol ) );
statQ95 = Expr(
Col Quantile( tempCol, 0.05 )
);
statQ75 = Expr(
Col Quantile( tempCol, 0.25 )
);
statQ50 = Expr(
Col Quantile( tempCol, 0.5 )
);
statQ25 = Expr(
Col Quantile( tempCol, 0.75 )
);
statQ5 = Expr(
Col Quantile( tempCol, 0.95 )
);
statMiss = Expr(
Col N Missing( tempCol )
);<BR /><BR />//Here's where I'm having trouble with the N Zero and proportions zero and non-zero.
Expr(
Summarize( dt, eg = By( tempCol ), em = Count( tempCol ) )
);
PropTemp1 = Expr(
Associative Array( eg, em )
);
statZero = Expr( PropTemp1["0"] );
statProp0 = Expr( statZero / statN );
statPropn0 = Expr( 1 - statProp0 );
maths = Associative Array();
maths["StatListA"] = Associative Array( StatsListA, {statMean, statStd, statMax, statMin, statRange, statN} );
maths["StatListB"] = Associative Array( StatsListB, {., statQ95, statQ75, statQ50, statQ25, statQ5} );
maths["StatListC"] = Associative Array( StatsListC, {statN, statMiss, statZero, statProp0, statPropn0} );
rbOptions = maths << Get Keys;
//User window
ValueDlg = Expr(
nwin = New Window( "GUI for quick stats",
<<RETURN result=""></RETURN>
これまでご協力いただきありがとうございました。その他の小さなことでもお役に立てれば幸いです。
ありがとう!、
DS
Re: ユーザーの選択に応じて更新される対話型ウィンドウのスクリプト作成のヘルプポイント1.について、からの返信に少しだけ追記@jthi 、 できるよ:
Names Default To Here( 1 );
//the width of the column list box in pixels
lbWidth = 100;
dt = Open("$SAMPLE_DATA/Big Class.jmp");
//List of statistics to calculate
StatsListA = {"Mean", "Std Dev", "Max", "Min", "Range", "N"};
StatsListB = {"95% quantile", "50% quantile", "5% quantile"};
//RadioBox() argument
rbArg = EvalList({ConcatItems(StatsListA, ", "), ConcatItems(StatsListB, ", ")});
//Window
New Window( "GUI for quick stats",
Panel Box( "Select Columns", ColListData = Col List Box( dt, all, <<SET data="https://community.jmp.com/" type=""></SET>
Re: ユーザーの選択に応じて更新される対話型ウィンドウのスクリプト作成のヘルプ簡単なテストを行い、スクリプトを添付しました。 これにどのようにアプローチするかについて考えられるアイデアはありますが、最善の解決策ではない可能性があります。
1.連想配列と式で処理されます。
2. この ColListData = Col List Box(dt, All, <
3. Set Function はこれを Evals で処理します。
添付のスクリプトは、私が今のところこれにどのように取り組んだかについての最良のアイデアを提供します。
