有沒有辦法讓 rowstate 處理程序不那麼遲鈍?是否可以使 rowstate 處理程序僅在鼠標鬆開時或選擇事件完成後觸發?
實時事件導致從我的圖表中拖動選擇滯後,使用戶體驗不愉快。
我已經完全重寫了捕鼠器中的選擇事件,但我無法將其應用於直方圖,而且我什至不喜歡它的表現。
如果我可以同時使用選擇框“Arrow(A)”工具和捕鼠器功能,這將滿足我的需要,這樣我就可以簡單地在捕鼠器事件結束時選擇我選擇的行,而不是發射一百萬拖動鼠標時的事件。
我不喜歡的東西:
您在選擇時向下移動鼠標的時間越長,越來越多無用的圖形腳本就會堆積到圖形中。
我只想擁有一個,而且只有一個。 我在末尾添加了一個循環以將它們全部從圖中刪除,這就是它們似乎“消失”的原因。
我可以把它們留在那裡,但它們會給圖表增加視覺噪音,我不知道當你得到太多它們時會發生什麼。
編輯:當你得到太多它們時,它們開始滯後。 銷毀圖形並重建它可能比循環刪除剩餘的圖形腳本更快。 編輯 2:銷毀圖形並重新創建它要快得多,但隨後縮放會重置,因此我必須捕獲更多有關圖形狀態的信息,以便我可以重建它以隱藏用戶的刷新。
我得到了 Shift/control click 的東西來工作它只是感覺太 hacky 不適合生產。 尤其是控件單擊它在您按下鼠標後有這麼長的滯後時間,即使您已經釋放按鈕,選擇框也會追逐鼠標,我認為 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>
數據混合和清理質量與工藝工程視窗回复:有沒有辦法讓 rowstate 處理程序不那麼滯後?我懷疑這在任何地方都有很好的記錄...... @Audrey_Shull
MouseTrap 和具有類似行為的 Handle 函數不像 Rect() 和其他函數那樣在線執行普通的圖形腳本函數如 Rect()。
當圖形腳本中的控制流通過 Handle() 或 MouseTrap() 時,該函數在 MouseTrap 的情況下不執行任何操作,或者在 Handle 的句柄位置繪製一個小矩形。 當您點擊帶有圖形腳本的圖形時,JMP 會在腳本中查找 MouseTrap 或 Handle 函數並按順序調用它們,直到其中之一需要點。
因此,在您的示例中,在您單擊之前,設置 x0 的代碼從未運行過。 但是 Rect 代碼會運行。
我相信,即使不嘗試,您也可以有幾個 Handles() 後跟一個 MouseTrap(),JMP 會獲取點擊點並將其傳遞給每個 Handle() 直到其中一個獲取它,或者 MouseTrap() 將總是拿它。
Rect() 可以在 for 循環中使用來繪製許多矩形。 您不能通過將 Handle(...) 放入循環中來創建多個句柄。 如果您需要創建可變數量的句柄,您可以使用 MouseTrap() 和 x,y 位置列表進行搜索,或者您可以使用某種形式的表達式操作來構建多個 Handle() 調用。
這也意味著 MouseTrap/Handle 必須在圖形腳本中,而不是在圖形腳本調用的用戶函數中。 另一方面,Rect 可以在從圖形腳本調用的用戶函數中。
如果您在圖形腳本中放置兩個 MouseTraps,我相信永遠無法到達第二個,因為第一個將始終接受點擊。
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 ) );
);
);回复:有沒有辦法讓 rowstate 處理程序不那麼滯後?這取得了很大的進步。 謝謝!
回复:有沒有辦法讓 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/*###*/
在腳本 2.jsl 的第 24 行
我對 mousetrap() 不是很熟悉;函數,它不需要 2x 內部函數嗎?
MouseTrap( MouseDown(x,y), MouseUp(x,y)));
我確實想弄清楚這一點,因為我認為我的很多滯後來自將點流式傳輸到 2x 列表,然後從這些列表中選擇第一個和最後一個。
回复:有沒有辦法讓 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);
);回复:有沒有辦法讓 rowstate 處理程序不那麼滯後?它超級懶惰。
我正在嘗試將 http 請求從 JSL 流式傳輸到 websertver,以根據 jmp 選擇生成實時儀表板。 我以為我可以用行狀態處理程序來做,但它太慢了,會破壞用戶體驗。 一旦獲得超過 500 點,性能就會直線下降。
我現在所擁有的是在圖表上進行選擇,單擊一個按鈕,然後呈現 http 報告。
我想擺脫那個按鈕點擊。
所以我現在要做的是在鼠標鬆開時,將一批數據發送到我的 http 服務器以生成我的儀表板。 就像一個 javascript 事件。
回复:有沒有辦法讓 rowstate 處理程序不那麼滯後?對於多個腳本,您可以在一個腳本中完成所有操作,並在 firstX 中使用缺失值將其關閉。 這是一個 q&d hack,只添加第二個腳本的一個副本,或者如果不添加則刷新圖表,並在完成後仍然使用您的邏輯將其刪除。
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;
);
);
回复:有沒有辦法讓 rowstate 處理程序不那麼滯後?簡化選擇哪裡盡可能表達。 我沒有看到 150 行的滯後,但對於 100K 行,它非常糟糕。 這讓我得到了 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^" ) );
);
存在三個變化:刪除 AsColumn、將下標從隱式循環中移除以及鏈接比較運算符。
@Audrey_Shull - 我希望探查器能處理這個。 分析器在窗口打開之前停止,所以我永遠無法研究在交互式選擇中花費的時間。
回复:有沒有辦法讓 rowstate 處理程序不那麼滯後?你想通過拖入 Graph Builder 框架框來做什麼? 如果是選擇行然後響應,一個與數據表關聯的行狀態處理程序就足夠了。
回复:有沒有辦法讓 rowstate 處理程序不那麼滯後?刪除打印件應該會使其更快,隱藏數據表也可能有所幫助。 此外,檢查兩個事件之間是否發生了一些“真實”變化也會有所幫助,但根據應用程序的不同,可能難以檢查。
回复:有沒有辦法讓 rowstate 處理程序不那麼滯後?是的,它們一直很難使用。
我需要一些東西來獲得實時響應,我希望行狀態處理程序是滯後的,因為它試圖寫入控制台並且它可能更快地完成其他任務。
重寫選擇標準對我的散點圖來說效果很好,儘管它有點簡陋,另一方面,我的分佈直方圖似乎不喜歡它。
回复:有沒有辦法讓 rowstate 處理程序不那麼滯後?不同的狀態處理程序在 JMP 中是一團糟,在我看來應該盡可能避免。 我已經為他們創建了願望清單項目以進行改進改進 JMP 的狀態處理程序(懸停標籤、行狀態處理程序、過濾器狀態處理程序、調度程序...)