Gibt es eine Möglichkeit, die Verzögerung des Rowstate-Handlers zu verringern?Ist es möglich, dass der Rowstate-Handler nur bei gedrückter Maus oder nach Abschluss eines Auswahlereignisses ausgelöst wird?
Das Echtzeitereignis führt zu Verzögerungen beim Ziehen der Auswahl aus meinem Diagramm und macht die Benutzererfahrung unangenehm.
Ich bin sogar so weit gegangen, ein Auswahlereignis in der Mausefallen-Sache komplett neu zu schreiben, aber ich habe Probleme, es auf Histogramme anzuwenden, und mir gefällt auch nicht, wie es funktioniert.
Es würde meinen Bedürfnissen genügen, wenn ich gleichzeitig mit der Mausefallenfunktion das Werkzeug „Pfeil (A)“ im Auswahlfeld verwenden könnte, sodass ich am Ende des Mausfallenereignisses einfach meine ausgewählten Zeilen aufheben könnte, anstatt eine Million abzufeuern Ereignisse, während Sie mit der Maus darüber ziehen.
Dinge, die mir nicht gefallen:
Je länger Sie die Maus beim Auswählen nach unten bewegen, desto mehr nutzlose Grafikskripte häufen sich im Diagramm.
Ich möchte nur eins und nur eins haben. Ich habe am Ende eine Schleife hinzugefügt, um sie alle aus dem Diagramm zu entfernen, weshalb sie scheinbar „verschwinden“.
Ich könnte sie einfach dort belassen, aber sie fügen der Grafik visuelles Rauschen hinzu, und ich weiß nicht, was passiert, wenn man zu viele davon hat.
Bearbeiten: Wenn Sie zu viele davon haben, beginnen sie zu verzögern. Es ist möglicherweise schneller, das Diagramm zu zerstören und neu zu erstellen, als die verbleibenden Grafikskripte in einer Schleife zu entfernen. Bearbeiten 2: Es geht viel schneller, das Diagramm zu zerstören und neu zu erstellen, aber dann wird der Zoom zurückgesetzt, sodass ich mehr über den Status des Diagramms erfassen muss, damit ich es neu erstellen kann, um die Aktualisierung vor dem Benutzer zu verbergen.
Ich habe das Umschalt-/Strg-Klick-Zeug zum Laufen gebracht, es fühlt sich einfach zu hackig für die Produktion an. Vor allem beim Strg-Klick gibt es diese lange Verzögerungszeit, nachdem Sie die Maus gedrückt haben, und das Auswahlfeld folgt der Maus, selbst wenn Sie die Taste bereits losgelassen haben. Ich glaube, jmp verarbeitet in der Zwischenzeit eine Reihe veralteter Drag-Ereignisse, bevor es aufhört, sich zu bewegen.
Oder verwerfen Sie einfach dieses ganze Abenteuer und finden Sie einen Weg, einen Zeilenstatus-Handler zu haben, der bei gedrückter Maus ausgelöst wird (das wäre ideal).
Beispiele, von denen ich Code ausgeliehen habe:
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>
Datenmischung und -bereinigungQualitäts- und VerfahrenstechnikWindowsBetreff: Gibt es eine Möglichkeit, die Verzögerung des Rowstate-Handlers zu verringern?Ich bezweifle, dass dies irgendwo sehr gut dokumentiert ist ... @Audrey_Shull
MouseTrap und die Handle-Funktion mit ähnlichem Verhalten werden nicht inline ausgeführt wie Rect() und die anderen normal Grafikskriptfunktionen wie Rect().
Wenn der Steuerungsfluss in Ihrem Grafikskript über Handle() oder MouseTrap() verläuft, führt die Funktion im Falle von MouseTrap nichts aus oder zeichnet ein kleines Rechteck an der Handle-Position für Handle. Wenn Sie mit einem Grafikskript auf ein Diagramm klicken, durchsucht JMP das Skript nach MouseTrap- oder Handle-Funktionen und ruft sie der Reihe nach auf, bis eine davon erreicht ist dauert Der Punkt.
In Ihrem Beispiel wurde der Code, der x0 festlegt, also nie ausgeführt, bis Sie darauf klicken. Aber der Rect-Code wird ausgeführt.
Ich glaube, ohne es auszuprobieren, könnten Sie mehrere Handles() gefolgt von einem MouseTrap() haben, und JMP würde den Klickpunkt nehmen und ihn an jedes Handle() weitergeben, bis einer von ihnen ihn übernimmt, oder MouseTrap(), was der Fall ist Nimm es immer.
Rect() kann in einer for-Schleife verwendet werden, um viele Rechtecke zu zeichnen. Sie können nicht mehrere Handles erstellen, indem Sie Handle(...) in eine Schleife einfügen. Wenn Sie eine variable Anzahl von Handles erstellen müssen, können Sie entweder MouseTrap() und eine Liste von XY-Positionen zum Durchsuchen verwenden oder eine Form der Ausdrucksmanipulation verwenden, um mehrere Handle()-Aufrufe zu erstellen.
Dies bedeutet auch, dass sich MouseTrap/Handle im Grafikskript befinden muss und nicht in einer Benutzerfunktion, die das Grafikskript aufruft. Rect hingegen kann in einer Benutzerfunktion enthalten sein, die vom Grafikskript aufgerufen wird.
Wenn Sie zwei MouseTraps in ein Grafikskript einfügen, kann die zweite meiner Meinung nach nie erreicht werden, da die erste den Klick immer akzeptiert.
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 ) );
);
);Betreff: Gibt es eine Möglichkeit, die Verzögerung des Rowstate-Handlers zu verringern?Das brachte eine große Verbesserung. Danke!
Betreff: Gibt es eine Möglichkeit, die Verzögerung des Rowstate-Handlers zu verringern?Habe es versucht, aber bekommen.
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);
);
Name nicht aufgelöst: x0 im Zugriff oder in der Auswertung von „x0“, x0/*###*/
in Zeile 24 im Skript 2.jsl
Ich bin mit der Mausefalle () nicht besonders vertraut. Funktion, braucht es nicht 2x interne Funktionen?
MouseTrap( MouseDown(x,y), MouseUp(x,y)));
Ich möchte das allerdings herausfinden, weil ich denke, dass ein großer Teil meiner Verzögerung darauf zurückzuführen ist, dass ich die Punkte in zwei Listen streame und dann den ersten und letzten aus diesen Listen auswähle.
Betreff: Gibt es eine Möglichkeit, die Verzögerung des Rowstate-Handlers zu verringern?Ich würde einfach die Schaltfläche verwenden (das habe ich getan), aber vielleicht ließe sich mit MouseTrap (oder MouseBox?) etwas erstellen.
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);
);Betreff: Gibt es eine Möglichkeit, die Verzögerung des Rowstate-Handlers zu verringern?Es ist super verzögert.
Ich versuche, HTTP-Anfragen von JSL an einen Webserver zu streamen, um ein Live-Echtzeit-Dashboard basierend auf JMP-Auswahlen zu generieren. Ich dachte, ich könnte es mit dem Zeilenstatus-Handler machen, aber er ist so verzögert, dass die Benutzererfahrung beeinträchtigt wird. Sobald Sie mehr als 500 Punkte sammeln, sinkt die Leistung.
Was ich gerade habe, ist, eine Auswahl im Diagramm zu treffen, auf eine Schaltfläche zu klicken und dann den http-Bericht zu rendern.
Ich möchte diesen Knopfklick loswerden.
Was ich jetzt versuche, ist, bei gedrückter Maus einen Datenstapel an meinen http-Server zu senden, um mein Dashboard zu generieren. Genau wie ein Javascript-Event.
Betreff: Gibt es eine Möglichkeit, die Verzögerung des Rowstate-Handlers zu verringern?Bei mehreren Skripten könnten Sie alles in einem einzigen Skript erledigen und einen fehlenden Wert in firstX verwenden, um es zu deaktivieren. Hier ist ein Q&D-Hack, um nur eine Kopie eines zweiten Skripts hinzuzufügen oder das Diagramm zu aktualisieren, wenn es nicht hinzugefügt wird, und es dennoch mithilfe Ihrer Logik zu entfernen, wenn Sie fertig sind.
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;
);
);
Betreff: Gibt es eine Möglichkeit, die Verzögerung des Rowstate-Handlers zu verringern?Vereinfachen Sie die Wählen Sie wo aus Ausdruck so weit wie möglich. Ich sehe die Verzögerung bei 150 Zeilen nicht, aber bei 100.000 Zeilen ist sie ziemlich schlimm. Das bringt mir eine 10-fache Verbesserung:
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^" ) );
);
Es gibt drei Änderungen: Entfernen von AsColumn, Entfernen der Subskription aus der impliziten Schleife und Verketten des Vergleichsoperators.
@Audrey_Shull - Ich wünschte, der Profiler würde damit arbeiten. Der Profiler stoppt, bevor das Fenster geöffnet wird, sodass ich nie die Zeit studieren kann, die ich für die interaktive Auswahl aufgewendet habe.
Betreff: Gibt es eine Möglichkeit, die Verzögerung des Rowstate-Handlers zu verringern?Was möchten Sie erreichen, indem Sie das Rahmenfeld des Graph Builder hineinziehen? Wenn es darum geht, Zeilen auszuwählen und dann zu reagieren, sollte ein mit der Datentabelle verknüpfter Zeilenstatus-Handler ausreichen.
Betreff: Gibt es eine Möglichkeit, die Verzögerung des Rowstate-Handlers zu verringern?Das Weglassen von Ausdrucken sollte es schneller machen, das Ausblenden der Datentabelle könnte auch ein wenig helfen. Auch die Überprüfung, ob es zwischen zwei Ereignissen eine „echte“ Änderung gibt, kann hilfreich sein, kann aber je nach Anwendung schwierig zu überprüfen sein.
Betreff: Gibt es eine Möglichkeit, die Verzögerung des Rowstate-Handlers zu verringern?Ja, sie waren schon immer schwer zu bedienen.
Ich brauche etwas, um eine Echtzeitantwort zu erhalten. Ich hoffe, dass der Zeilenstatus-Handler verzögert ist, weil er versucht hat, in die Konsole zu schreiben, und dass er für andere Aufgaben möglicherweise schneller ist.
Das Umschreiben der Auswahlkriterien funktioniert für mein Streudiagramm recht gut, obwohl es etwas umständlich ist. Meine Verteilungshistogramme hingegen scheinen es nicht zu mögen.
Betreff: Gibt es eine Möglichkeit, die Verzögerung des Rowstate-Handlers zu verringern?Verschiedene Statushandler sind in JMP ein Chaos und sollten meiner Meinung nach nach Möglichkeit vermieden werden. Ich habe einen Wunschlisteneintrag erstellt, um sie zu verbessern Verbessern Sie die Status-Handler von JMP (Hover-Label, Zeilen-Status-Handler, Filter-Status-Handler, Scheduler usw.)