こんにちは、みんな、
ある Expr1() では正常に評価される変数が、最初の Expr を呼び出す別の Expr2() では正しく評価されないという問題があります。 対象の列の分布を生成する Expr1() を定義したコードがあります。 後で、Expr1() をコールバックする別の式 Expr2() を作成します。 Expr1() には、Expr2() では正しく評価されない変数があります。
ビジュアルの場合、Expr2() は次のようなウィンドウを生成します。

最初の式 Expr1() は、グラフ ビルダーの下に含まれるディストリビューション プラットフォームを生成します。 分布の下にあるコンボ ボックスとボタン ボックスを使用すると、ユーザーは、さまざまな R^2、RMSE、平均絶対値偏差、-Logliklihood などのさまざまな適合統計を切り替えることができます。私の目的は、それに応じて GB と分布の両方を更新することです。 GB は適切に更新されますが、Distribution は更新されません。 たとえば、適合統計を RMSE に変更すると、結果は次のようになります。

分布グラフは更新されますが、Expr1() 内で確立したサイズ設定ではなく、デフォルトのサイズ設定が使用されます。分布グラフが最初の画像と同じサイズの場合、次のように見えるはずです。

Distribution が生成される Expr1() 内のコードのセクションは次のとおりです。
//this part gets column names to insert into Dispatch() below<BR />sfitcol1 = Column( NNYCol + NNcolshift ) << Get Name;
sfitcol2 = Column( NNYCol + 1 + NNcolshift ) << Get Name;
sfitcol3 = Column( NNYCol + 2 + NNcolshift ) << Get Name;<BR /><BR />//in this example, the results are:<BR />//"RMSE Training"<BR />//"RMSE Validation"<BR />//"RMSE Test"
<BR />//this part generates the Distributions that will be used to change my output report in Expr2()
dt_results << Distribution(
Continuous Distribution( Column( Eval( NNYCol + NNcolshift ) ), Quantiles( 0 ) ),
Continuous Distribution( Column( Eval( NNYCol + 1 + NNcolshift ) ), Quantiles( 0 ) ),
Continuous Distribution( Column( Eval( NNYCol + 2 + NNcolshift ) ), Quantiles( 0 ) ),
SendToReport(
Dispatch( {sfitcol1}, "Distrib Histogram", FrameBox, {Frame Size( 60, 100 )} ),
Dispatch( {sfitcol1}, "Distrib Outlier Box", FrameBox, {Frame Size( 30, 100 )} ),
Dispatch( {sfitcol2}, "Distrib Histogram", FrameBox, {Frame Size( 60, 100 )} ),
Dispatch( {sfitcol2}, "Distrib Outlier Box", FrameBox, {Frame Size( 30, 100 )} ),
Dispatch( {sfitcol3}, "Distrib Histogram", FrameBox, {Frame Size( 60, 100 )} ),
Dispatch( {sfitcol3}, "Distrib Outlier Box", FrameBox, {Frame Size( 30, 100 )} )
)
);Expr1() を単独で実行すると、問題なく動作します。問題は、Expr2() が Expr1() を呼び出すときに失敗することです。これは、Dispatch で変数 sfitcol# を評価していないため、FrameBox のサイズが変更されないことが原因です。コードで想定されているとおりです。
ディストリビューションを交換する Expr2() のコード セクション (コンボ ボックスのみを使用) は次のとおりです。
NNycb = Combo Box(
NNylist,
<<SET></SET>
Expr1() の一部をコンボ ボックス関数に追加してから sfitcol 変数を実行し、レポートに送信してフレーム ボックスを変更すると、埋め込みログに次のエラーが記録されます。
アウトライン コンテキスト {sfitcol1} で項目「sfitcol1」が見つかりません
アウトライン コンテキスト {sfitcol1} で項目「sfitcol1」が見つかりません
アウトライン コンテキスト {sfitcol2} で項目「sfitcol2」が見つかりません
アウトライン コンテキスト {sfitcol2} で項目「sfitcol2」が見つかりません
アウトライン コンテキスト {sfitcol3} で項目「sfitcol3」が見つかりません
アウトライン コンテキスト {sfitcol3} で項目「sfitcol3」が見つかりません
次に、列名を手動で入力すると、たとえば最初の Dispatch: Send to Report(Dispatch({"RMSE Training"}, "Distrib Histogram", Framebox, Frame Size{(60,100)})) のように、列名が変更されます。それに応じてフレームボックス。

したがって、Expr1() で定義した方法は可能であり、実行する必要がありますが、Expr2() で実行するときに変数の値 (テキスト) ではなく変数が渡されます。 これを修正する方法についていくつかの提案が得られることを期待しています。 Eval(Substitute(Expr())) タイプのソリューションを使用する必要はないと思いますが、おそらく使用する必要があります。
ご意見、アイデア、ご提案をお待ちしております。
ありがとう!、
DS
ディストリビューションの作成時にフレーム サイズを設定することは避け、ディストリビューションの作成後にフレーム サイズを変更します。 特定のフレームボックスを特定のサイズに設定しているため、XPath を使用して参照を取得し、サイズを変更するのは非常に簡単です。
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dist = dt << Distribution(
Continuous Distribution(Column(:height), Quantiles(0)),
Continuous Distribution(Column(:weight), Quantiles(0))
);
wait(1); // demo purposes
rep = Report(dist);
(rep << XPath("//FrameBox[@helpKey='Distrib Histogram']")) << Frame Size(60, 100);
(rep << XPath("//FrameBox[@helpKey='Distrib Outlier Box']")) << Frame Size(30, 100);
wait(0);
dist << get xml;
あなたが直面している問題に関しては、確実にテストスクリプトを作成する必要がありますが、そこでそれらの値を評価する必要があると思います。
こんにちは@jthi 、
迅速な対応と問題の解決に改めて感謝いたします。 XPath コマンドは非常に優れており、XPath についての短い Scripting Index エントリを読むだけで、XPath とそれをさらに活用する方法についてもっと読む必要があることがわかります。 余談ですが、これについては Scripter's Club でもう議論されましたか? そうでなければ、それは良い話題になるかもしれません。
とにかく、私が手元にある状況に近づけるようにコードを修正しましたが、問題なく動作します。 以下の修正バージョンを参照してください。Expr2 が Expr1 を呼び出し、Expr2 内で配布フレーム サイズが変更されています。
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Expr1 = Expr(
dist = dt << Distribution(
Continuous Distribution( Column( :height ), Quantiles( 0 ) ),
Continuous Distribution( Column( :weight ), Quantiles( 0 ) )
)
);
Expr2 = Expr(
Nwin = New Window( "Dists", Outline Box( "Results", Expr1 ) );
Wait( 1 ); // demo purposes
(Report( dist ) << XPath( "//FrameBox[@helpKey='Distrib Histogram']" )) << Frame Size( 60, 100 );
(Report( dist ) << XPath( "//FrameBox[@helpKey='Distrib Outlier Box']" )) << Frame Size( 30, 100 );
);
Expr2;
このことを知らない人のために注意すべき点は、コードの XPath 部分を New Window() オブジェクト内に含めることはできないということです。
(Report( dist ) << XPath( "//FrameBox[@helpKey='Distrib Histogram']" )) << Frame Size( 60, 100 );
(Report( dist ) << XPath( "//FrameBox[@helpKey='Distrib Outlier Box']" )) << Frame Size( 30, 100 );
コードのその部分は、新しいウィンドウの外側にある必要があります。 私の特定のケースでは、コンボボックスまたは「前へ」/「次へ」ボタンが押されたときに関数の一部としてこれを含める必要があることがわかりました。そうしないと、Distribution のサイズが元のサイズに変更されます。 たとえば、コンボ ボックス オプションの場合は次のようになります。
NNycb = Combo Box(
NNylist,
<<SET></SET>
最初にウィンドウの前に追加するときに、ディストリビューションがデフォルトのサイズに変更される瞬間がありますが、その後は非常に迅速に正しくサイズ変更されます。
ご協力に改めて感謝いたします。JMP ディスカッション フォーラムで新しいことを学べることにいつも感謝しています。
ありがとう!、
DS
XPath についてはセッション 7 (レポート層) ですぐに説明したと思いますが、レポート層へのアクセスとトラバースについては、他の長いセッションで取り上げるのに適したトピックだと思います。 Xpath は基本的に独自の言語であり、JSL から他のプログラミング言語に直接変換するスキルの 1 つです (正規表現は他の例です)。 XPath チュートリアル (w3schools.com) 。 << XPath を使用して JMP のレポート層にアクセスすると、簡単にリスト参照のリストを参照したり、リストにメッセージを送信したりできるので、非常に便利です。 << Get XML と << XPath を組み合わせると、さまざまな表示ボックスへの堅牢な「パス」 (基本的には参照を取得) を構築できます。