Abhängig davon, was Sie bereits über JSL wissen und wie viel Sie wissen möchten, ist im obigen Beispiel eine ganze Menge implizites Wissen enthalten. Neben der PDF-Datei „Scripting Guide“ selbst ist „Hilfe > Scripting Index“ nützlich, wenn Sie bereits Code haben und verstehen möchten, wie er funktioniert. Wenn Sie den Code im Editor haben, können Sie mit der rechten Maustaste auf ein Schlüsselwort klicken, um diesen anzuzeigen, normalerweise mit einem Beispiel. Dadurch wird auch angezeigt, auf welche Nachrichten ein Objekt wie der lokale Datenfilter reagiert. Sie können dies auch mit dem Befehl „ShowProperties()“ abrufen.
In Bezug auf Variablen und ihren Umfang möchten Sie vielleicht einen Blick darauf werfen Namensräume . JMP erledigt alles im Speicher.
@ian_jmp : Heilig... wow.
Es fällt mir schwer zu verstehen, was Sie getan haben – es sieht so aus, als hätten Sie eine Funktion erstellt, die cx, cy und cRad immer dann einstellt, wenn sich der lokale Filter ändert. Das ist echt cool.
Zwei kurze Folgefragen, da ich noch dabei bin, JSL zu lernen: (1) Wo bleibt diese Funktion, wenn ich das Skript ausführe? Liegt es nur irgendwo im RAM? Gibt es einen Ort, an dem ich es später finden kann? Irgendwo eine Option „Liste der verfügbaren Benutzerfunktionen anzeigen…“? (2) Gibt es eine Möglichkeit zu sehen, welche Objekte im GB-Objekt verfügbar sind, wenn ich „gb = dt << Graph Builder(...)“ ausführe? Ähnlich wie „dir(obj)“ in Python?
Beeindruckend! Danke schön!!
Sieht so aus, als ob Sie tatsächlich „Make Filter Change Handler()“ benötigen. Hier finden Sie ein Beispiel:
NamesDefaultToHere(1);
// Example table
dt = New Table( "Test Circles",
Add Rows( 20 ),
New Column( "dataset",
Numeric,
"Nominal",
Format( "Best", 12 ),
Set Values( [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 4, 5, 5, 5, 5] )
),
New Column( "x",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values(
[0.1739, 0.4959, 0.3498, 0.4005, 0.6558, 0.5159, 0.7165, 0.7467, 0.6812,
0.902, 0.4638, 0.5823, 0.9902, 0.1275, 0.9176, 0.8493, 0.2, 0.2, 0.8,
0.8]
)
),
New Column( "y",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values(
[0.8721, 0.0109, 0.2249, 0.3135, 0.2398, 0.6867, 0.236, 0.146, 0.1684,
0.7458, 0.7862, 0.6482, 0.4948, 0.8169, 0.2477, 0.1575, 0.8, 0.2, 0.8,
0.2]
)
),
New Column( "cx",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values(
[0.4985, 0.4985, 0.4985, 0.4985, 0.4985, 0.4985, 0.4985, 0.4985, 0.4985,
0.4985, 0.4985, 0.4985, 0.4985, 0.4962, 0.4962, 0.4962, 0.5, 0.5, 0.5,
0.5]
)
),
New Column( "cy",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values(
[0.5027, 0.5027, 0.5027, 0.5027, 0.5027, 0.5027, 0.5027, 0.5027, 0.5027,
0.5027, 0.5027, 0.5027, 0.5027, 0.4958, 0.4958, 0.4958, 0.5, 0.5, 0.5,
0.5]
)
),
New Column( "cRad",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values(
[0.4918, 0.4918, 0.4918, 0.4918, 0.4918, 0.4918, 0.4918, 0.4918, 0.4918,
0.4918, 0.4918, 0.4918, 0.4918, 0.489, 0.489, 0.489, 0.4243, 0.4243,
0.4243, 0.4243]
)
)
);
// Initial parameters for drawing a circle (used when there is no selection in the data filter)
cx = cy = cRad = 0.0;
// Graph Builder with locked scales . . .
gb = dt << Graph Builder(
Show Control Panel( 0 ),
Lock Scales( 1 ),
Variables( X( :x ), Y( :y ) ),
Elements( Points( X, Y, Legend( 7 ) ) )
);
gbRep = Report(gb);
// Add graphics script for a circle
gbRep[FrameBox(1)] << Add Graphics Script(
2,
Description( "Circle" ),
Pen Color( "Blue" );
Circle( {cx, cy}, cRad );
);
// Add Local Data Filter . . .
ldf = gb << Local Data Filter();
// Add the filter column, and get a reference to the filter column object ('fc' is not actually used)
ldf << Add Filter( columns(:dataset));
fc = ldf << GetFilterColumn(:dataset);
// Function to get new circle parameters from the Local Data Filter selection
getCircleFromFilter =
Function( {x},
theseRows = ldf << getFilteredRows;
if(IsMatrix(theseRows),
// Assume it's safe to get the required values from just the first row in the current selection
cx = Column(dt, "cx")[theseRows[1]];
cy = Column(dt, "cy")[theseRows[1]];
cRad = Column(dt, "cRad")[theseRows[1]];
,
// No selection should give no visible circle
cx = cy = cRad = 0.0;
);
// Force the graphics script to be revaluated with the current parameters of the circle
gbRep[FrameBox(1)] << reShow;
);
// Assign the Filter Change Handler to the local data filter to do the work
rsh = ldf << Make Filter Change Handler(getCircleFromFilter);
Hallo,
Ich habe nur einen kleinen Teil der Lösung herausgefunden, indem ich die Tabelle mit diesem kurzen Skript durchgegangen bin (kann im Eingabefenster „Anpassen > Skript“ hinzugefügt werden).
for (i= 1 , i <= N Row (), i++,
circle({:cx[i],:cy[i]},:cRad[i]);
);
Leider konnte ich keine Funktion finden, die den Status der Zeilenauswahl im GB Local Filter dynamisch zurückgibt. Vielleicht möchten Sie in einem neuen Beitrag gezielt nach diesem Thema fragen: Es muss einen Weg geben.
Tut mir leid, dass ich nicht viel geholfen habe.
Am besten,
TS