rowstate ハンドラーの遅延を軽減する方法はありますか?rowstateハンドラーをマウスアップ時または選択イベントの完了後にのみ起動するようにすることは可能ですか?
リアルタイム イベントにより、グラフからのドラッグ選択に遅れが生じ、ユーザー エクスペリエンスが不快になります。
ネズミ捕りの選択イベントを完全に書き直すところまでは行きましたが、それをヒストグラムに適用するのに苦労しており、そのパフォーマンスも気に入りません。
マウストラップ関数と同時に選択ボックスの「矢印(A)」ツールを使用でき、マウストラップ イベントの最後に選択した行を 100 万回実行する代わりに簡単に選択できれば、ニーズを満たすことができます。マウスをドラッグしながらイベントを移動します。
嫌いなもの:
選択中にマウスを長く動かすほど、無駄なグラフィックス スクリプトがグラフにどんどん積み重なっていきます。
唯一無二のものを持っておきたいですね。 最後にループを追加して、それらをすべてグラフから消去しました。これが、それらが「消えていく」ように見える理由です。
それらをそのまま残すこともできますが、それらはグラフに視覚的なノイズを追加するため、それらの数が多すぎると何が起こるかわかりません。
編集: それらの数が多すぎると、遅延が始まります。 ループして残ったグラフィックス スクリプトを削除するよりも、グラフを破棄して再構築する方が速い場合があります。 編集2: グラフを破棄して再作成するほうがはるかに高速ですが、ズームがリセットされるため、グラフを再構築してユーザーから更新を隠すことができるように、グラフの状態をさらにキャプチャする必要があります。
Shift/コントロールのクリック機能は動作するようになりましたが、本番環境にはハックすぎるように感じます。 特にコントロールのクリックには、マウスアップ後の長いラグタイムがあり、ボタンを放した後でも選択ボックスがマウスを追いかけます。jmp は、移動が停止するまでの間に、大量の古いドラッグ イベントを処理していると思います。
あるいは、この冒険全体を放棄して、マウスアップ時に起動する行状態ハンドラーを使用する方法を見つけてください (それが理想的です)。
コードを借用した例:
http://www.pega-analytics.co.uk/blog/segmented-regression/
https://community.jmp.com/t5/Discussions/Quick-way-to-compare-two-lists-and-identify-the-uncommon/td-p/5811
Names Default To Here(1);
dt = open("$sample_data\Iris.jmp");
MY_GRAPH_BUILDER = Graph Builder(
Size( 531, 456 ),
Show Control Panel( 0 ),
Variables( X( :Sepal length ), Y( :Sepal width ) ),
Elements( Points( X, Y, Legend( 3 ) ) ),
SendToReport(
Dispatch({},"Graph Builder",
FrameBox,
{Add Graphics Script(MouseTrap( MouseDown(x,y), MouseUp(x,y)))}
),
),
);
//MOUSE STUFF
get_box_dims = Function({firstX,lastX,firstY,lastY},
show("get_box_dims");
//show(firstX,lastX,firstY,lastY,modifier_key);
If (lastX>firstX,
max_x = lastX; min_x =firstX,
max_x = firstX;min_x =lastX,
);
If (lastY>firstY,
max_y = lastY; min_y =firstY,
max_y = firstY;min_y =lastY,
);
show(min_x,min_y,max_x,max_y);
evallist({min_x,max_x,min_y,max_y});
);
do_normal_select = Function({select_range},
show("normal_select");
dt << Select Where(
AsColumn(:Sepal length) >= select_range[1]
& AsColumn(:Sepal length) <= select_range[2]
& AsColumn(:Sepal width) >= select_range[3]
& AsColumn(:Sepal width) <= select_range[4]
);
);
do_shift_select = Function({select_range},
show("shift_select");
new_rows_to_add = as list(dt << Get Rows Where(
AsColumn(:Sepal length) >= select_range[1]
& AsColumn(:Sepal length) <= select_range[2]
& AsColumn(:Sepal width) >= select_range[3]
& AsColumn(:Sepal width) <= select_range[4]
)
);
if (length(new_rows_to_add) > 0,
curr_rows = as list(dt << Get Selected Rows);
rows_to_select = curr_rows || new_rows_to_add;
dt << Select Rows( rows_to_select);
);
show(new_rows_to_add,length(new_rows_to_add));
);
do_ctrl_select = Function({select_range},
show("ctrl_select");
new_rows_to_subtract = associativearray(as list(dt << Get Rows Where(
AsColumn(:Sepal length) >= select_range[1]
& AsColumn(:Sepal length) <= select_range[2]
& AsColumn(:Sepal width) >= select_range[3]
& AsColumn(:Sepal width) <= select_range[4]
)
));
if (length(new_rows_to_subtract) > 0,
curr_rows = associativearray(as list(dt << Get Selected Rows));
show("current_rows_selected",length(curr_rows));
show("number_rows_to_subtract",length(new_rows_to_subtract));
intersection=curr_rows;intersection<<INTERSECT></INTERSECT>
データのブレンディングとクリーンアップ品質およびプロセスエンジニアリングウィンドウズRe: rowstate ハンドラーの遅延を軽減する方法はありますか?これはどこにもあまり詳しく文書化されていないと思います... @Audrey_Shull
MouseTrap と同様の動作を持つ Handle 関数は、Rect() や他の関数のようにインラインで実行されません。普通Rect() のようなグラフィックス スクリプト関数。
グラフィックス スクリプトの制御フローが Handle() または MouseTrap() を経由する場合、MouseTrap の場合、関数は何も実行しないか、Handle のハンドル位置に小さな四角形を描画します。 グラフィック スクリプトを使用してグラフをクリックすると、JMP はスクリプト内で MouseTrap 関数または Handle 関数を調べ、いずれか 1 つが見つかるまでそれらを順番に呼び出します。かかりますポイント。
したがって、この例では、クリックするまで、x0 を設定するコードは実行されません。 ただし、Rect コードは実行されます。
試してみなくても、複数の Handles() の後に MouseTrap() を置くことができ、JMP はクリック ポイントを取得して、そのうちの 1 つがそれを取得するまで、または MouseTrap() がそれを取得するまで、それを各 Handle() に渡します。常にそれを取ります。
Rect() を for ループで使用すると、多数の四角形を描画できます。 Handle(...) をループに入れて複数のハンドルを作成することはできません。 可変数のハンドルを作成する必要がある場合は、MouseTrap() と X、Y 位置のリストを使用して検索するか、何らかの形式の式操作を使用して複数の Handle() 呼び出しを構築することができます。
これは、MouseTrap/Handle がグラフィックス スクリプトが呼び出すユーザー関数ではなく、グラフィックス スクリプト内に存在する必要があることも意味します。 一方、Rect は、グラフィックス スクリプトから呼び出されるユーザー関数内に含めることができます。
グラフィックス スクリプトに 2 つの MouseTrap を配置した場合、1 つ目は常にクリックを受け入れるため、2 つ目に到達することはできないと思います。
New Window( "Example",
exx = 20,
exy = 50;
Graph Box(
Frame Size( 200, 200 ),
If( 0, // note that it still works
Mousetrap(
exx = x;
exy = y;
)
);
Circle( {0, 0}, Sqrt( exx * exx + exy * exy ) );
);
);Re: rowstate ハンドラーの遅延を軽減する方法はありますか?これにより大きな改善が見られました。 ありがとう!
Re: rowstate ハンドラーの遅延を軽減する方法はありますか?これを試してみましたが、得られました。
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
gb = dt << Graph Builder(
Size(529, 457),
Show Control Panel(0),
Variables(X(:weight), Y(:height)),
Elements(Points(X, Y, Legend(3)))
);
fb = Report(gb)[FrameBox(1)];
i = 0;
fb << Add Graphics Script(
Mousetrap(
If(i == 0,
x0 = x; y0 = y;
);
exx = x; exy = y;
i++;
,
i = 0;
show("RELEASED");
);
Rect(x0, y0, exx, exy);
);
名前が解決されていません: 'x0' のアクセスまたは評価中の x0 、x0/*###*/
Script 2.jsl の 24 行目
私は、mousetrap() についてはあまり詳しくありません。関数、内部関数が 2 つ必要ではないでしょうか?
MouseTrap(MouseDown(x,y),MouseUp(x,y)));
ただし、ラグの多くは、ポイントを 2x リストにストリーミングし、それらのリストから最初と最後を選択することから生じていると思うので、これを理解したいと思っています。
Re: rowstate ハンドラーの遅延を軽減する方法はありますか?私はボタンを使用するだけですが (これが私がやったことです)、MouseTrap (または MouseBox?) を使用して何かを構築できるかもしれません。
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
gb = dt << Graph Builder(
Size(529, 457),
Show Control Panel(0),
Variables(X(:weight), Y(:height)),
Elements(Points(X, Y, Legend(3)))
);
fb = Report(gb)[FrameBox(1)];
i = 0;
fb << Add Graphics Script(
Mousetrap(
If(i == 0,
x0 = x; y0 = y;
);
exx = x; exy = y;
i++;
,
i = 0;
show("RELEASED");
);
Rect(x0, y0, exx, exy);
);Re: rowstate ハンドラーの遅延を軽減する方法はありますか?超ラグいです。
JMP の選択に基づいてライブ リアルタイム ダッシュボードを生成するために、JSL から WebServer に http リクエストをストリーミングしようとしています。 行状態ハンドラーを使用してそれを実行できると考えましたが、非常に遅れてユーザーエクスペリエンスが損なわれます。 500ポイントを超えるとパフォーマンスが急激に低下します。
現時点では、グラフ上で選択を行い、ボタンをクリックすると、http レポートが表示されます。
そのボタンクリックをなくしたいのです。
そこで、私が今やろうとしていることは、マウスを押したときに、データのバッチを http サーバーに送信して、ダッシュボードを生成することです。 JavaScriptのイベントと同じです。
Re: rowstate ハンドラーの遅延を軽減する方法はありますか?複数のスクリプトの場合は、すべてを 1 つのスクリプトで実行し、firstX の欠落値を使用して無効にすることができます。 ここでは、2 番目のスクリプトのコピーを 1 つだけ追加するか、追加しない場合はグラフを更新し、完了したらロジックを使用して削除する Q&D ハックを紹介します。
MouseDown = Function( {px, py},
Insert Into( lstX, pX );
Insert Into( lstY, pY );
firstX = lstX[1];
lastX = lstX[N Items( lstX )];
firstY = lstY[1];
lastY = lstY[N Items( lstY )];
// quick and dirty hack to only add the script once
If( N Items( ((Report( MY_GRAPH_BUILDER )[FrameBox( 1 )]) << XPath( "//TopSeg" )) << get script ) < 2,
(Report( MY_GRAPH_BUILDER )[FrameBox( 1 )]) << Add Graphics Script(
Line Style( "solid" );
Fill Color( "BlueGreen" );
Transparency( 0.3 );
Rect( firstX, firstY, lastX, lastY, 1 );
);
, // ELSE make sure to redraw using new values (might work without this)
(Report( MY_GRAPH_BUILDER )[FrameBox( 1 )]) << inval << updatewindow;
);
);
Re: rowstate ハンドラーの遅延を軽減する方法はありますか?簡略化して、場所を選択してください可能な限り表現します。 150 行では遅延は見られませんが、100,000 行ではかなりひどいです。 これにより 10 倍の改善が得られます。
do_normal_select = Function( {select_range},
{start, stop, sr1, sr2, sr3, sr4},
//show("normal_select");
start = HP Time();
sr1 = select_range[1];
sr2 = select_range[2];
sr3 = select_range[3];
sr4 = select_range[4];
dt << Select Where( sr1 <= :Sepal length <= sr2 & sr3 <= :Sepal width <= sr4 );
// dt << Select Where(
// AsColumn(:Sepal length) >= select_range[1]
// & AsColumn(:Sepal length) <= select_range[2]
// & AsColumn(:Sepal width) >= select_range[3]
// & AsColumn(:Sepal width) <= select_range[4]
// );
stop = HP Time();
Write( Eval Insert( "\!nselect where ^stop-start^" ) );
);
変更点は 3 つあります。AsColumn の削除、暗黙的ループからの添え字の削除、比較演算子の連鎖です。
@Audrey_Shull - プロファイラーがこれで機能するようになればいいのにと思います。 プロファイラーはウィンドウが開く前に停止するため、対話型の選択に費やされた時間を調べることはできません。
Re: rowstate ハンドラーの遅延を軽減する方法はありますか?グラフ ビルダーのフレーム ボックス内をドラッグして何をしようとしていますか? 行を選択して応答する場合は、データ テーブルに関連付けられた行状態ハンドラーで十分です。
Re: rowstate ハンドラーの遅延を軽減する方法はありますか?印刷を削除すると高速になるはずです。データ テーブルを非表示にすることも少しは役立つかもしれません。 また、2 つのイベントの間に「実際の」変更が加えられたかどうかを確認することも役立ちますが、アプリケーションによっては確認するのが難しい場合があります。
Re: rowstate ハンドラーの遅延を軽減する方法はありますか?そうですね、いつも使いにくかったです。
リアルタイムの応答を取得するために何かが必要です。行状態ハンドラーがコンソールに書き込もうとしたため遅延しており、他のタスクの方が高速である可能性があることを願っています。
選択基準を書き直すと、私の散布図では十分に機能しますが、ちょっとぎくしゃくしていますが、一方で、私の分布ヒストグラムは気に入らないようです。
Re: rowstate ハンドラーの遅延を軽減する方法はありますか?JMP ではさまざまな状態ハンドラーは混乱するため、可能であれば避けるべきだと私の意見ではあります。 改善してほしいウィッシュリスト項目を作成しましたJMP の状態ハンドラー (ホバー ラベル、行状態ハンドラー、フィルター状態ハンドラー、スケジューラーなど) を改善しました。