以前、メールでいくつかのトピックについて言及しましたが、ここにいくつかのアイデアを挙げておきます。
- 参照の使用
- dt = Open()... など、Current Data Table() の代わりに
- レポートへの参照をレポート レイヤー内で堅牢な方法で見つける
- 名前空間/スコープの管理
- 変数の初期化
- プログラミングスタイルを見つける
- グローバルを大文字で書く
- 表現を活用する
- トライキャッチ
- ログ記録
- 表示、書き込み、印刷、カスタムロガー
- スタックの活用
- ボタン/ウィンドウ内の変数
- 特に関数から戻るとき
- コンテキスト ボックス()、ウィンドウ:
- ボタン - パス
- スクリプトのパッケージ化
- 大規模なJMP作成スクリプトの代わりに、それらから部分を分離してより堅牢なスクリプトを作成します。
- ベストプラクティス
- シンボル/グローバルのクリア/削除を避ける
- クリアログスクリプトを残さないでください
- 変数/名前空間のロック
- パス
- ファイルパスの変換
- デフォルトディレクトリ
- $PATH_VARIABLES
- 列の参照
- Column(dt, "colname") と dt:colname と :colname、dt:"colname"n (および AsColumn) など...
- 浮動小数点演算
- コードを書くときは、事前によく考えてくださいvs 許可を求めるよりも許しを求める方が簡単です
- 欠損値/空の値
- 空です()、不足しています()、If、IfMZ、N 項目() > 0
- 開いているテーブル、開いているレポート、既に開いているカスタム ウィンドウなどをチェックしています...
- << ウィンドウを最前面に表示
- .jsl の Throw() と jmpaddin の比較
- カスタムモーダルウィンドウ機能
- JMPで作成したスクリプトの改善(および活用)
- 参照/変数の追加
- JMPで作成されたスクリプトの短縮
- 派遣を避ける
- ユーザーの好みがこれらにどのように影響するか(通常は非常に大きな問題を引き起こします)
- データ構造の理解と活用
- たとえば、すべてを異なる変数名に保存する必要はありません(特にEval Parseを使用する場合は不要です)。
- リスト/連想配列を使用する
- UIについて話す場合は、必要なときに参照できるでしょうか
部分的に関連のある投稿(「新しい」JMP コミュニティ ページのため、非常に乱雑に見える可能性があります)
ありがとう。ここで私のものをいくつか共有できますが、私がやっていることのほとんどはすでに上で述べたとおりです。
- Try(close(dt_ref,nosave)); dt_ref = Open(...) --> テーブルをクリーンアップし、スクリプトを初めて実行したときにエラーを生成しません。問題は、テーブルの名前を変更できるが、dt 参照も切り替わるため、JSL はテーブルを閉じてしまうことです。
- 常にタブを使用して大きなループや関数を識別し、コード内で迷子になって不足している ); を検索しないようにします。
- 複数の言語を使用する可能性がある場合は、表作成ステップの後に列の名前を変更することを検討してください。これにより、他のユーザーのコードが壊れる可能性がありますが、自分のコードは正常に動作します。
- Try to dynamically work with reference in platform to avoid user inputs.
You could do this:
dt << Process screening(Process Variables({:Column 4, :Column 6, :Column 7}));
But you can also use this:
dt = current data table();
col_names = dt << get column names();
spec_list = {};
for(k=1,k<=nitems(col_names),k++,
if(!isempty(column(dt,k) << Get Property("Speclimits")),insertinto(spec_list,col_names[k]);););
dt << Process screening(Process Variables(eval(spec_list)));
altering a column name will then not break the code and the question about missing spec limits will not be triggered. -
おそらく、添付のようなものにするでしょう (すべてに目を通すには時間が足りないでしょうが、それは問題ではないはずです)。最終的には「JSL のヒント」のようなものになるかもしれませんが、それを作成するだけでもかなりの時間がかかりました。
ありがとう、Jarmo。スクリプトについての感想をいくつか。
行 103: ループが非常に短く、実行する行が 1 行しかない場合にのみこれを使用します。これにより、コードが少し整理されます。
109 行目: 短い名前を使用すると、JMP 関数を、mean = (x1 + x2) / 2 のような変数でオーバーライドするときに問題が発生する可能性があります。m_production_speed または mean_production_speed と記述する方が適切です。
149 行目: コードを折りたたむために、コンマの直後に if ループをコメントする習慣をつけました。
次のようにコードを記述します。
if(1,//average of x
mean_x = mean(x);
);
コードを折りたたむと、次のようになります。

これにより、for ループまたは if ステートメントの上の行が節約されます。
198 行目: 「マトリックスを初期化しましょう。事前に作成しておけば、マトリックスを埋めるのが速くなります」。copilot でこれに 1 分かかりました。200 個のコメントを含むコードをデバッグするのは想像できません *g*。
212 行目: ログとワークフローを参考にして、自分のプログラミング スタイルに合わせてコードを変更できることを述べておきます。これは特に、プログラミングを知らないユーザーに、私がプログラムするスクリプトで実現したいことのワークフローを作成するように依頼する場合に当てはまります。そのため、私はユーザーが何を求めているかをよく理解しており、ほとんどの機能は既にコード化されています。
行 391: グラフ ビルダーを開いたままテーブルを反復処理すると、変更のたびにグラフが更新されないので、スクリプトの速度が向上します。
Names Default To Here( 1 );
try(close(dt,nosave));
dt = new table("test");
dt << New Column( "Y",
Numeric,
"Continuous",
Format( "Best", 12 ),
<<SET initial="" data="https://community.jmp.com/"></SET><SPAN>行 414: これに加えて、次の点も追加します。<< Subset などの関数を使用するときに固定名を指定する場合は、常にテーブル参照を追加します。これは、生成名がすでに存在し、JMP が末尾に「 2」を自動的に追加する場合に非常に役立ちます。参照がないと、間違ったテーブルで誤って作業する可能性があります。</SPAN>
<SPAN>74行目: これは私のスクリプトに取り入れたいものです</SPAN>:)</img>
<SPAN>757 行目: これも、ループの速度を極端に低下させる場合があります。ただし、SQL ステートメントを処理する場合は便利です。リクエストの送信によってスクリプトの残りの部分が追い越され、データの取得に時間がかかるためにエラーが発生する可能性があるためです。ただし、コードを 1 行ずつ実行すると正常に動作します。</SPAN>
line 780: maybe referencing to the JSL cook book? <A href="https://community.jmp.com/t5/JSL-Cookbook/tkb-p/jmp-scripting" target="_blank">JSL クックブック - JMP ユーザー コミュニティ</A>
line 787: Just be aware that this will also break when a report reference name contains a variable.
This is what happened here: <A href="https://community.jmp.com/t5/Discussions/fitting-truncated-data-to-a-continuous-distribution/m-p/772495#M95287" target="_blank">Re: 切り捨てられたデータを連続分布に適合させる - JMP ユーザー コミュニティ</A>
the detection limits is added with censored data in the title and can change depending on the data set.
THX a lot for the script.<BR /><BR />Regards<BR /> Mauro
787行目
これがまさに、helpKey 属性が使用可能な場合はほぼ常に XPath を使用する理由です (アウトライン ボックスのタイトルは気にしません)。堅牢な参照を構築する (試みる) 方法は多すぎるため、例を挙げて 20 分ほど費やすことができます。
たとえば、検出限界の場合、helpKey またはワイルドカードのいずれかを使用します (アウトライン ボックス名が変更される可能性があることがわかっている場合)。
Names Default To Here(1);
dt = open("$SAMPLE_DATA/Big Class.jmp");
Column(dt, "height") << Set Property("Detection Limits", {60, 100});
dist = dt << Distribution(
Stack(1),
Continuous Distribution(
Column(:height),
Horizontal Layout(1),
Vertical(0),
Process Capability(0),
Fit Normal
)
);
obs = Report(dist) << XPath("//OutlineBox[@helpKey='FitDistributions']");
show(obs << get title);
// Or
ob = Report(dist)[OutlineBox("Fitted Normal Distribution?")];
show(ob << get title);
// Or
obs2 = Report(dist) << XPath("//OutlineBox[contains(text(), 'Fitted Normal Distribution')]");
show(ob << get title);
</CODE></P>
<P>I also added few things based on your comments. Thanks!<CODE class=" language-jsl">