ヘルプ ユーザーの選択に応じて更新される対話型ウィンドウのスクリプト作成親愛なるみんな、
私は、ディストリビューション プラットフォームを呼び出すことなく、ユーザーの簡単な統計を実行するために、組織内のユーザーに展開されるスクリプトを作成しています。 以下のスクリプトは、現在私が持っているもののスクリーンショットと、問題が発生しているもののリストです。 ユーザーは 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() のオプションを [すべて] から [数値] ("" の有無にかかわらず) に変更すると、空の列のリストが表示されます。 このオプションが定義されている場合、数値列のみがリストされるはずなのに、なぜこれが発生するのかわかりません。
- これが私が考える最も難しいことです: 前に述べたように、パネル ボックスの [結果] の結果を、左側の [統計] 列で更新したいと思います (StatsListX からの統計とその計算結果がリストされます)。右側の列「値」に統計が表示されます。 これは、ラジオ ボタンをクリックするたびに更新される必要があります。 したがって、最初は :height を調べていたが、:weight も調べたい場合は、:weight を選択し、いずれかのラジオ ボタンをクリックして、関連する統計概要を取得します。 ここに示されている Set Function の例に従ってみましたが、失敗しました (Set Function 呼び出しについてはよくわかりません)。

MathA の Expr() は、元のウィンドウを閉じて結果を含む新しいウィンドウを開いて呼び出すことを意図していましたが、JMP ディスカッションでさらに調査した結果、既存のウィンドウ内のフィールドを更新できることがわかりました。私がこの問題にアプローチする方法はこれです。 したがって、コードの先頭にある元のコードは、私が意図していることに対して適切なコードではないことはわかっています。
これに関してご協力いただければ幸いです。
ありがとう!、
DS
品質およびプロセスエンジニアリングRe: ユーザーの選択に応じて更新される対話型ウィンドウのヘルプ スクリプト作成これはとてもきれいですね。 この議論に感謝します。
Re: ユーザーの選択に応じて更新される対話型ウィンドウのヘルプ スクリプト作成こんにちは、みんな、
継続的に変更を提案していただきありがとうございます。 私はスクリプトにいくつかの変更を加え、最新の修正バージョンの方が気に入っているので、他の人の貢献に本当に感謝しています。 更新されたスクリプトは、この返信の最後に掲載されます。 この新しいスクリプトは、文字データ型の概要統計も提供します。 パネルのレイアウトも少し変更しました。
@jthi , ご提案はとても良かったと思い、取り入れさせていただきました。 結果統計の色付きのヘッダー名が気に入っています。 また、同じようなもの@Erratic Attack彼らのコードにあったので、新しい列を選択するか、新しい数値結果を選択すると統計が更新されるようにしました。 Big Class.jmp データ テーブルのように多くのレベルが存在する可能性があるため、キャラクター統計結果の垂直サイズを変更できるようにしました。 その列タイプに変更するとカテゴリ統計も更新されますが、文字列が選択されている場合に数値統計オプションをクリックするとエラーがスローされます。 ウィンドウの幅サイズが変更され続けないように、幅の提案を維持しました。 ごめん@Erratic Attack , 現時点では、新しい名前空間の定義やコードの変更方法についてはあまり詳しくありません。 これは非常に便利で、物事に取り組む良い方法のように見えますが、正しい方法を学ぶ必要があるだけです。
これ、特に美観を改善する方法については、他にも提案があると思います。 もしそうなら、投稿してください。ただし、このディスカッションに最新情報があることがわかるように、必ず私にタグを付けてください。 改善提案をしていただいた皆様に改めて感謝いたします。
ありがとう!、
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: ユーザーの選択に応じて更新される対話型ウィンドウのヘルプ スクリプト作成こんにちは@jimloughlin 、
それは単なるデバッグコードだったと思います@jthi私が投稿した元のコードに提案された編集を提供するときに使用していました。 このスレッドに書いた他の人からの提案された編集を考慮した更新版を投稿します。 更新されたスクリプトを投稿するときにタグ付けします。 Big Class.jmp データテーブルでは問題なく動作しています。
ありがとう!、
DS
Re: ユーザーの選択に応じて更新される対話型ウィンドウのヘルプ スクリプト作成ここに私の2セントを投げ込みます。多くの場合、スクリプトを論理的に分離されたユニットまたは関数にできる限り分割することが最善です。そのためには、表示ツリーからロジックを削除し、関数定義を可能な限りフラット化する方がはるかに良いと考えています。
以下の私のソリューション例では、すべての関数のスコープが次のとおりであることがわかります。自己名前空間と、各関数の最初の行のスコープが自己名前空間。実際に私がやったことは、これを自動的に行うメタプログラミング ラッパーを作成することです。これにより、明示的に定義する必要がなくなります。自己名前空間を含めるか、 self = 名前空間( "名前" )各関数の最初の引数として行を追加します。対話型 GUI を多数作成する場合は、作業を大幅に節約できるため、同様のことを行うとよいでしょう。これには、スクリプトをラップする必要がないという利点もあります。 Eval( Eval Expr( "<コード>" ) )ブロック。
また、このルートをたどる場合は、ビルトイン表示ボックスのラッパーを作成して、自己機能を備えており、内部に多くの定型文を配置する必要はありません。 << 関数を設定()メッセージ。
/* 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) を追加して、ユーザーが複数の列を選択できないようにすることができます。
- [クイック統計]パネル ボックスを選択します。 ユーザーが列を選択していない場合の、ある種の「エラー処理」。
いくつかの変更を加えた完全なスクリプト:
もっと見る...
Re: ユーザーの選択に応じて更新される対話型ウィンドウのヘルプ スクリプト作成こんにちは@jthiそして@ian_jmp 、
お二人とも大変お世話になりありがとうございました! 最後の 2 つの最後のヒントをありがとう@jthi , 連想配列のアルファベットの「問題」を克服することができました。 私は AA の機能が気に入っており、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 を使用してこれを処理します。
添付のスクリプトは、現時点で私がこれにどのようにアプローチしたかを最もよく示しています。
