有没有办法让 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 的状态处理程序(悬停标签、行状态处理程序、过滤器状态处理程序、调度程序……)