助けてください。スクリプトはスクリプトウィンドウでは正常に実行されますが、列の数式で実行すると失敗します。こんにちは、
M 個の要素が N 個のメトリックに及ぼす個々の統計的影響を分析して、データ テーブルを要約するスクリプトを作成しました。
要約表には、N 個の指標 (行) と M 個の要因 (列) のマトリックスが表示され、具体的な影響は平均シフト、Cpk の低下、またはその両方です。
列の数式を使用して、選択した各行の分布をプロットする機能を追加したいと思います。
私はこの投稿からインスピレーションを受けました:
セル(JMP テーブル内)をスクリプトにリンクしますか?
問題は、スクリプトが固定された選択行(この例では [5])の新規スクリプトウィンドウでは正常に動作するが、:Graph 列の式にスクリプトを含めると失敗するという点です。なぜなのかわかりません…
これをデバッグするのを手伝ってもらえますか?
2 つのテーブルを添付しました: 生データを含む datatable_test.jmp、列の式を含む Summary.jmp。:Graph 列でプロットするセルをクリックします。
現在、エラーは次のように表示されます: :”行 [ ] の不正な参照 (再帰)”

両方のテーブルを開いた状態で次のスクリプトを実行すると、期待どおりに動作します (下記参照)。ただし、テーブルから直接実行するとスクリプトは失敗します (グラフ列のセルをクリック)。

よろしくお願いします。
- 説教者
// this script works from a Script window
// All features related to the column formula are commented
// here the row selected is row 5 : rn1 = [5]
Names Default To Here( 1 );
dt = Data Table( "datatable_test" );
dt2 = Data Table( "Summary" );
//If( Selected( Row State() ),
Eval(
Parse(
rn1 = [5]/*dt2 << get selected rows*/;
rn = rn1[1];
Factors = dt2 << get column names( "string" );
show(rn1, rn);
Eval(
Eval Expr(
For( i = N Items( Factors ), i >= 1, i--,
CurrCol = Column( dt2, Factors[i] );
If(Char( CurrCol[ rn ] ) == "Ok" | Factors[i] == "Metric"| Factors[i] == "Graph",
Remove From( Factors, i, 1 )
);
)
)
);
FactorA = "X( :" || Char( Factors[1] ) || ", Position( 1 ))";
FactorB = "X(1)";
For( j = 2, j <= N Items( Factors ), j++,
FactorA = Char( FactorA ) || ",X( :" || Char( Factors[j] ) ||
", Position( 1 ))";
FactorB = Char( FactorB ) || ",X( " || Char( j ) || " ) ";
);
Show( dt2:Metric[rn], FactorA, FactorB );
Key = dt2:Metric[rn];
Eval Insert(
" dt << Graph Builder(
Size( 534, 464 ),
Show Control Panel( 0 ),
Show Legend( 0 ),
Variables(
Y( ^Key^ ), ^FactorA^),
Elements( Box Plot( Y, Legend( 18 ), ^FactorB^ ) ),
SendToReport(
Dispatch(
{},
ScaleBox,
{Min( -0.485125992718803 ), Max( 5.53364268893602 ), Inc( 1 ),
Minor Ticks( 0 )}
)
)
) "
);
)
//)
);自動化とスクリプトRe: ヘルプ、スクリプトはスクリプトウィンドウでは正常に実行されますが、列の数式で実行すると失敗します列の数式を使用してこれを行う特別な理由はありますか? たとえば、テーブル ボックスとボタンを含むカスタム ウィンドウを使用すると、構築と管理がはるかに簡単になります。または、サマリー テーブルで行状態ハンドラーを使用することもできます (ただし、可能であればこれは避けます)。
Re: ヘルプ、スクリプトはスクリプトウィンドウでは正常に実行されますが、列の数式で実行すると失敗しますこんにちは、ジャーモさん
特別な理由はありませんが、データ テーブルを使用して要約を生成するという方法で、独自のスクリプトを作成しました。
それについては考えていませんでした。テーブル ボックスを開いてボタンを追加するのは良いアイデアのように思えます。それを念頭に置いて将来のバージョンを変更することができます。
しかし、その間、列の式を機能させることは価値があると思いますか? そうすれば、次のバージョンより早く機能するバージョンを手に入れることができますか? 表示/テーブル ボックスにまだあまり慣れていないため、データ テーブルではなくテーブル ボックスを生成するように構造を変更すると、しばらく時間がかかるのではないかと心配しています。
列式に含めたいスクリプトは、それ自体では動作しますが、列式で実行すると失敗します。何か間違っているに違いありませんが、何が間違っているのかわかりません...
Re: ヘルプ、スクリプトはスクリプトウィンドウでは正常に実行されますが、列の数式で実行すると失敗します編集:
実際に、テーブルをディスプレイ ボックスに変換するのは簡単だということがわかりました。
nw = New Window("Report",
dt << Get As Report()
);以下にレポートが生成されました

行をクリックしたときに、レポートで数式が機能するとは思っていませんでした (実際には機能しません...)。
しかし、今のところ、あなたの提案をどのように進めていくべきかわかりません。
(また、私はまだディスプレイ ボックスの操作に慣れていません)
前もって感謝します
Re: ヘルプ、スクリプトはスクリプトウィンドウでは正常に実行されますが、列の数式で実行すると失敗します編集2:
Jarmo の推奨とこの投稿に従って、最終的にスクリプトを動作させることができました。
JSL ヘルプ: レポートとテーブル ボックスとして取得
レポートの行をクリックすると、選択した行に基づいてスクリプトが実行されます。これはまさに私が必要としていたものです。:)

以下のスクリプトでは、最初のメッセージで結合した2つのテーブルを開く必要があります。
ありがとう
- 説教者
Names Default To Here( 1 );
dt7 = Data Table("Summary");
dt = Data Table("datatable_test");
dt7 << clear select;
dt7 << Clear Column Selection();
RptWin = New Window( "Data Table as report",
Outline Box("Data Table as Report",
dt7_Rpt = dt7 << Get as Report();
)
);
tb = dt7_Rpt[Table Box( 1 )];
tb << Set Heading Column Borders( 1 );
tb << Set Selectable Rows( 1 );
tb << Set Row Change Function(
Function( {this},
{SelRows},
SelRows = this << Get Selected Rows;
If(
N Items( SelRows ) > 1, Throw( "Too many items selected!\!rOnly one selection possible." ),
N Items( SelRows ) == 1,
SelRows = this << Get Selected Rows;
);
dt7 << Clear Select;
rn = dt7 << Select rows( SelRows ) << get selected rows;
show (rn[1], dt7:Metric[rn]);
Factors = dt7 << get column names( "string" );
Eval(
Eval Expr(
For( i = N Items( Factors ), i >= 1, i--,
CurrCol = Column( dt7, Factors[i] );
If(Char( CurrCol[ rn[1] ] ) == "Ok" | Factors[i] == "Metric"| Factors[i] == "Graph",
Remove From( Factors, i, 1 )
);
)
)
);
show (Factors);
Try(FactorA = "X( :" || Char( Factors[1] ) || ", Position( 1 ))");
FactorB = "X(1)";
For( j = 2, j <= N Items( Factors ), j++,
Try(FactorA = Char( FactorA ) || ",X( :" || Char( Factors[j] ) || ", Position( 1 ))");
FactorB = Char( FactorB ) || ",X( " || Char( j ) || " ) ";
);
Show( dt7:Metric[rn], FactorA, FactorB );
Key = dt7:Metric[rn];
If (Factors != {},
Eval(Parse(Eval Insert(
" dt << Graph Builder(
Size( 534, 464 ),
Show Control Panel( 0 ),
Show Legend( 0 ),
Variables(Y( ^Key^ ), ^FactorA^),
Elements(
Box Plot( Y, Legend( 18 ), ^FactorB^ ),
Caption Box(X, Y, Legend(20), Summary Statistic( \!"N\!" ),Location( \!"Graph per factor\!" ))),
SendToReport(
Dispatch(
{},
ScaleBox,
{Min( -0.485125992718803 ), Max( 5.53364268893602 ), Inc( 1 ),
Minor Ticks( 0 )}
)
)
) "
))),
Eval(Parse(Eval Insert(
" dt << Graph Builder(
Size( 534, 464 ),
Show Control Panel( 0 ),
Show Legend( 0 ),
Variables(Y( ^Key^ )),
Elements(
Box Plot( Y, Legend( 18 )),
Caption Box(Y, Legend(20), Summary Statistic( \!"N\!" ))),
SendToReport(
Dispatch(
{},
ScaleBox,
{Min( -7.06199976676385 ), Max( 26.8097086791615 ), Inc( 5 ),
Minor Ticks( 0 )}
)
)
) "
)))
)
));Re: ヘルプ、スクリプトはスクリプトウィンドウでは正常に実行されますが、列の数式で実行すると失敗します私が試してみたいもう 1 つの改善点は、Eval(Parse()) を削除することです (これにより、スクリプトのデバッグが容易になり、悪い習慣を身につけずに済みます)。ただし、これには多少の労力とさまざまなテクニックが必要になるため、ゆっくりと取り組む必要があります。
12 時間以内に確認して、何ができるかを把握することもできます。
Re: ヘルプ、スクリプトはスクリプトウィンドウでは正常に実行されますが、列の数式で実行すると失敗します同意します。私はさらに一歩進んで、 Eval Insert()も置き換えます。
Eval(Parse())に関しては、スキップすることができます。

Parse は引数として文字列を必要とします。
式が評価され、結果の文字列が解析されて式として返されます。
Parse(Print(1);"a"||"b")
それで、
Parse(Print(1);Eval Insert(Graph Builder());"a")
1 を出力し、グラフを作成して、式として a を返します。中央部分だけに興味がある場合は、 Parse をスキップできます。
Parse(Eval Insert()) をEval()でラップしても評価は行われます。
一方、 Eval(Eval Expr()) は、内部にあるExpr() を評価するためにのみ必要です。
Expr()がなければ、コードから削除しても問題はありません。
一般的には、ヘルプ/サンプル データ フォルダーのデータ セットに基づいたコードを投稿することをお勧めします。
そうすれば、インターネット経由でファイルをダウンロードする必要なく、コードをすぐに実行できます。
追加の利点: コードをさまざまな入力に適応させると、問題を理解しやすくなることがよくあります。
多くの場合、質問を投稿するための正しいコードを持っているのに、質問が消えてしまいます : )

Re: ヘルプ、スクリプトはスクリプトウィンドウでは正常に実行されますが、列の数式で実行すると失敗しますこれは複雑に見えますが(実際複雑です)、これが私がおそらくこの問題に取り組む方法です(これが唯一の方法ではなく、<< 変数の追加/<< 要素の追加を利用することもできます)
Names Default To Here(1);
dt_summary = Open("$DOWNLOADS/Summary.jmp");
dt = Open("$DOWNLOADS/datatable_test.jmp");
dt << New Column("Ones", Numeric, Nominal, Set Each Value(1));
dt_summary << clear select;
dt_summary << Clear Column Selection();
possible_factors = dt_summary << get column names("string");
Remove From(possible_factors, Contains(possible_factors, "Metric"));
Remove From(possible_factors, Contains(possible_factors, "Graph"));
create_report = function({sel_row}, {Default Local},
valid_factor_idx = Loc(dt_summary[sel_row, possible_factors], "Ok");
valid_factors = possible_factors[valid_factor_idx];
key = dt_summary[sel_row, "Metric"];
If(N Items(valid_factors) == 0,
valid_factors = {"Ones"};
);
variables_expr = Expr(Variables());
bp_expr = Expr(Box Plot(Y, Legend(18)));
dt = dt; // JMP being JMP
For Each({valid_factor, idx}, valid_factors,
x_expr = EvalExpr(X(Expr(Name Expr(AsColumn(dt, valid_factor))), Position(1)));
Insert Into(variables_expr, Name Expr(x_expr));
Insert Into(bp_expr, Eval Expr(X(Expr(idx))));
);
y_expr = EvalExpr(Y(Expr(Name Expr(AsColumn(dt, key)))));
Insert Into(variables_expr, Name Expr(y_expr));
gb_expr = Substitute(
Expr(dt << Graph Builder(
Size(534, 464),
Show Control Panel(0),
Show Legend(0),
_variables_,
Elements(
_boxplot_,
Caption Box(X, Y, Legend(20), Summary Statistic("N"), Location("Graph per factor"))
),
SendToReport(
Dispatch({}, ScaleBox, {Min(-7.06199976676385), Max(26.8097086791615), Inc(5), Minor Ticks(0)})
)
)),
Expr(_variables_), Name Expr(variables_expr),
Expr(_boxplot_), Name Expr(bp_expr)
);
gb = Eval(gb_expr);
return();
);
nw = New Window("Data Table as report",
Outline Box("Data Table as Report",
summary_report = dt_summary << Get as Report();
)
);
report_tb = summary_report[Table Box(1)];
report_tb << Set Heading Column Borders(1);
report_tb << Set Selectable Rows(1);
report_tb << Set Row Change Function(Function({this},
selrows = this << Get Selected Rows;
If(N Items(selrows) > 1,
Throw("Too many items selected!\!rOnly one selection possible.")
);
create_report(selrows[1]);
));
Write();
これが機能したら、ユーザー エクスペリエンスについて考え始めます。
- おそらく、押すと選択した行のレポートを作成するボタンを使用する必要があるでしょうか?
- ユーザーが複数の行を選択できるようにできますか?
- その場合、すべてのレポートを同じウィンドウに作成する必要がありますか?
- グラフがすでに作成されている場合、再作成する必要がありますか?
- ユーザーがウィンドウを閉じるときに、データ テーブルも閉じる必要がありますか?
- ..
もっと見る...Names Default To Here(1);
dt_summary = Open("$DOWNLOADS/Summary.jmp");
dt = Open("$DOWNLOADS/datatable_test.jmp");
dt << New Column("Ones", Numeric, Nominal, Set Each Value(1));
dt_summary << clear select;
dt_summary << Clear Column Selection();
possible_factors = dt_summary << get column names("string");
Remove From(possible_factors, Contains(possible_factors, "Metric"));
Remove From(possible_factors, Contains(possible_factors, "Graph"));
create_report = function({sel_row}, {Default Local},
valid_factor_idx = Loc(dt_summary[sel_row, possible_factors], "Ok");
valid_factors = possible_factors[valid_factor_idx];
key = dt_summary[sel_row, "Metric"];
If(N Items(valid_factors) == 0,
valid_factors = {"Ones"};
);
variables_expr = Expr(Variables());
bp_expr = Expr(Box Plot(Y, Legend(18)));
dt = dt; // JMP being JMP
For Each({valid_factor, idx}, valid_factors,
x_expr = EvalExpr(X(Expr(Name Expr(AsColumn(dt, valid_factor))), Position(1)));
Insert Into(variables_expr, Name Expr(x_expr));
Insert Into(bp_expr, Eval Expr(X(Expr(idx))));
);
y_expr = EvalExpr(Y(Expr(Name Expr(AsColumn(dt, key)))));
Insert Into(variables_expr, Name Expr(y_expr));
gb_expr = Substitute(
Expr(dt << Graph Builder(
Size(534, 464),
Show Control Panel(0),
Show Legend(0),
_variables_,
Elements(
_boxplot_,
Caption Box(X, Y, Legend(20), Summary Statistic("N"), Location("Graph per factor"))
),
SendToReport(
Dispatch({}, ScaleBox, {Min(-7.06199976676385), Max(26.8097086791615), Inc(5), Minor Ticks(0)})
)
)),
Expr(_variables_), Name Expr(variables_expr),
Expr(_boxplot_), Name Expr(bp_expr)
);
return(gb_expr);
);
nw = New Window("Data Table as report",
H List Box(
Outline Box("Data Table as Report",
summary_report = dt_summary << Get as Report();
),
Outline Box("Actions",
Button Box("Create Reports",
sel_rows = report_tb << Get Selected Rows;
lub_collector = Lineup Box(N Col(2));
For Each({selrow}, sel_rows,
lub_collector << Append(create_report(selrow));
);
nw_graphs = New Window("Graphs",
lub_collector
);
wait(0);
),
Button Box("Close Window", summary_report << close window);
)
)
);
report_tb = summary_report[Table Box(1)];
report_tb << Set Heading Column Borders(1);
report_tb << Set Selectable Rows(1);
I will edit and add images here if JMP Community ever lets me do it...
Edit: Images


Re: ヘルプ、スクリプトはスクリプトウィンドウでは正常に実行されますが、列の数式で実行すると失敗しますJarmoとHogi、本当にありがとう。
返信がかなり遅くなってしまいました。沈黙していて申し訳ありません。ここ数か月は他の優先事項に集中しなければなりませんでしたが、今はこれに戻ることができます。
これについて反省し、あなたの提案を試してみます。
最高、
-説教者