私は、JMP スクリプトに関するいくつかのヒントとコツをすぐに紹介しました。 JMP スクリプターズ クラブ 第 2 四半期。
私の技術的な説明は正しくない可能性があり、完全に理解するつもりはないため、あちこちで間違った用語を使用している可能性があります。すべての(ほとんどの場合のみ) JMP と JSL で何が起こっているのか、私はコードが適切かつ高速に動作することだけを望んでいます。
ヒント1 JMP Script Editorの埋め込みログを有効にする
埋め込みログを有効にすると、JMP のスクリプト エディタで直接 JMP ログをすばやく簡単に確認できるようになります。 埋め込みログは、スクリプト エディターの JMP 設定から有効にできます。 JMP16 では、埋め込みログの高さを変更することもできます (私は個人的に 25% ~ 30% の値を使用しています)。

役立つかもしれないリンク
JMP のテキスト ログイン (jmp.com ヘルプ)
ヒント 2 JMP16+ の場合、拡張ログを有効にする
JMP16 では、拡張ログと呼ばれる新機能がリリースされました。 これにより、JMP で対話的に実行した内容が追跡され、それらのアクションにスクリプトが提供されるため、JMP にスクリプトを簡単に作成させることができます。
拡張ログは、JMP の設定から有効にできます。 キャプチャされる内容や拡張ログの外観を変更することもできます。

役立つかもしれないリンク
強化されたログおよびアクションレコーダー - JMP 16 および JMP Pro 16 の新機能
JMP 16 の強化されたログイン: これによりすべてが変わります
JMP の強化されたログイン (jmp.com)
Tip3 変数から式への値の評価
これは、JMP コミュニティで非常に一般的なトピックです。たとえば、変数の値が式に評価されないのはなぜですか。 これは基本的に、値が式 (変数) の「外」で評価されなかったことを意味します。 以下は、問題と考えられる解決策を示す例です (私の推奨方法は Eval(EvalExpr()) + Expr() です)。
例1 計算式
この例では、Eval(EvalExpr()) を使用しない列と Eval(EvalExpr()) を使用する列の 2 つの列が作成されます。 ないものは式の変数名のままになります
もっと見る...
データテーブルと数式(数式がどのように見えるか、x から 3 の値に何が起こったかに注意してください(現在は 4 乗されています))

このデータ テーブルを保存し、再度開いて新しい行を追加すると、データ テーブルはべき乗の値を認識していないため、次のエラー メッセージが表示されます。

これは、Names Default To Here(1); を使用しているためです。サンプル スクリプトでは、このエラーは良いことです。 Names Default To Here(1) を使用していない場合。スクリプトを開始します (「追加のチップ)、power 変数をグローバル名前空間に追加すると、データ テーブルは同じ JMP セッション内の power 値を引き続き認識します。 ここで、データ テーブルが想定どおりに動作していると思ってテーブルを共有すると、テーブルを共有した相手はなぜ動作しないのか疑問に思うことになるかもしれません。
例2 スペック制限の設定
このサンプル スクリプトは、Eval(EvalExpr()) を使用して列プロパティ (この場合は仕様制限) に値を取得する方法を示しています。
もっと見る...
Names Default To Here(1);
// Create demo table
dt = New Table("Demo",
Add Rows(6),
New Column("Label", Character, "Nominal", Set Values({"A", "A", "A", "B", "B", "B"})),
New Column("x", Numeric, "Continuous", Format("Best", 12), Set Values([1, 2, 3, 4, 5, 6])),
New Column("y1", Numeric, "Continuous",
Set Values(
[0.540628764079884, 0.0138843499589711, 0.363861175486818, 0.697015449637547, 0.114948588656262, 0.685370508348569]
)
),
New Column("y2", Numeric, "Continuous",
Set Values(
[0.540628764079884, 0.0138843499589711, 0.363861175486818, 0.697015449637547, 0.114948588656262, 0.685370508348569]
)
),
New Column("y3", Numeric, "Continuous",
Set Values(
[0.540628764079884, 0.0138843499589711, 0.363861175486818, 0.697015449637547, 0.114948588656262, 0.685370508348569]
)
)
);
Column(dt, "y1") << Set Property(
"Spec Limits",
{LSL(-1), USL(1), Show Limits(1)}
);
lower_limit = 0.5;
upper_limit = 1.5;
Column(dt, "y2") << Set Property(
"Spec Limits",
{LSL(lower_limit), USL(upper_limit), Show Limits(1)}
);
Eval(
EvalExpr(
Column(dt, "y2") << Set Property(
"Spec Limits",
{LSL(Expr(lower_limit)), USL(Expr(upper_limit)), Show Limits(1)}
);
)
);
名前のデフォルトはここ(1)です。 // デモ テーブルを作成します dt = New Table("Demo", Add Rows(6), New Column("Label", Character, "Nominal", Set Values({"A", "A", "A", " B", "B", "B"}))、新しい列("x"、数値、"Continuous"、Format("Best", 12)、設定値([1, 2, 3, 4, 5, 6]))、新しい列("y1"、数値、"連続"、値を設定( [0.540628764079884, 0.0138843499589711, 0.363861175486818, 0.697015449637547, 0.114948588656262) 、0.685370508348569] ) )、新しい列("y2"、数値、"連続"、設定値( [0.540628764079884, 0.0138843499589711, 0.363861175486818, 0.697015449637547, 0.114948588656262, 0.685370508348569] ) )、新しい列("y3"、数値、"連続"、値を設定( [0.540628764079884, 0.0138843499589711, 0.363861175486818, 0.697015449637547, 0.114948588656262, 0. 685370508348569] ) ) ); Column(dt, "y1") << Set Property( "仕様制限", {LSL(-1), USL(1), 制限表示(1)} );下限 = 0.5;上限 = 1.5; Column(dt, "y2") << Set Property( "Spec Limits", {LSL( lower_limit), USL(upper_limit), Show Limits(1)} ); Eval( EvalExpr( Column(dt, "y2") << Set Property( "スペックリミット", {LSL(Expr( lower_limit)), USL(Expr(upper_limit)), Show Limits(1)} ); ) );
例3 << クローズ時
最後の例として、誤って参照を上書きしないようにスクリプトを保護する方法を示します。 このことについては、すぐに話しました2022_Q1 MakeOverChallenge: マウスクリック時のさまざまなアクションチャレンジB
このスクリプトを実行して二変量ウィンドウを閉じると、Big Class ではなく Semiconductor Capability テーブルが閉じられていることがわかります。 これは、二変量ウィンドウが閉じているときに、dt がすでに半導体機能を参照しているためです (dt_semi など、別の変数名を使用することもできます)。
もっと見る...
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
biv = dt << Bivariate(Y(:Weight), X(:Height), Nonpar Density);
biv << On Close(
close(dt, no save)
);
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
名前のデフォルトはここ(1)です。 dt = Open("$SAMPLE_DATA/Big Class.jmp"); biv = dt << Bivariate(Y(:体重), X(:身長), 非標準密度); biv << On Close( close(dt, no save) ); dt = Open("$SAMPLE_DATA/半導体能力.jmp");
このコードを実行すると、正しいテーブルが閉じられます。 これは、Big Class テーブルへの << On close ステートメントへの参照を評価しているためです。
もっと見る...
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
biv = dt << Bivariate(Y(:Weight), X(:Height), Nonpar Density);
Eval(EvalExpr(
biv << On Close(
Close(Expr(biv << Get Data Table), no save)
);
));
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
名前のデフォルトはここ(1)です。 dt = Open("$SAMPLE_DATA/Big Class.jmp"); biv = dt << Bivariate(Y(:体重), X(:身長), 非標準密度); Eval(EvalExpr( biv << On Close( Close(Expr(biv << Get Data Table), no save) ); )); dt = Open("$SAMPLE_DATA/半導体能力.jmp");
役立つかもしれないリンク
Eval Insert、Eval Expr、Parse、Substitute を使用して、ある式を別の式に挿入する
式処理関数: パート I - Expr()、NameExpr()、Eval() などの解明 難問
式 (JMP ヘルプ、jmp.com)
式関数 (JMP ヘルプ、jmp.com)
追加のヒント Default To Here(1) という名前でスクリプトを開始します。
これにより、グローバル変数による名前空間の汚染から保護され、将来の問題が回避されます。これは、カスタム名前空間を使用する場合でも、新しいスクリプト ファイルを開始するときに常に実行することです。 これは、グローバル名前空間に誤って変数が作成されることを避けるためです。
役立つかもしれないリンク
高度なスコープ設定と名前空間 (JMP ヘルプ、jmp.com) (非常に読みやすいです。複数のページがあるので、必ずほとんどのページを確認してください。)
名前解決のルール (JMP ヘルプ、jmp.com)
効率と再現性を高めるための基本的なスクリプト作成: より少ない作業でより多くの作業を行う (2019-US-TUT-290)
見かけたら、以下の理由から削除したりコメントアウトしたりする傾向があります。 @donmcormack
やあ@レッセル、
同意する@donmcormack 、グローバル変数をクリアしない方が良いでしょう。 これを望まない理由の 1 つの例として、スクリプトに「呼び出し」機能がある場合が考えられます。この機能では、「呼び出し」ボタンをクリックすると、ロールまたは値にキャストした変数または列を呼び出すことができます。 JMP プラットフォームで使用するために入力されたものは自動的に置き換えられるため、戻って手動で行う必要はありません。 スクリプトの先頭にclear globals(1)がある場合、スクリプトを実行するたびに、リコール変数がメモリからクリアされ、実質的にリコール関数が役に立たなくなります。
DS
@レッセル、個人的には、実行中の他のスクリプトに干渉する可能性があるため、Clear Globals(1) は避けたいと思います。 スクリプト変数のスコープをローカルに設定するか、独自の名前空間に設定する方がはるかに安全です。
に関しては、
Names default to here (1);
使っている人も見かけました
Clear globals (1);
さらにスクリプトの先頭にも。
それが役立つ理由は理解できるような気がしますが、それについてはどう思いますか?