MakeRowStateHandler-Funktion: Alle Zeilen außer den ausgewählten in einer anderen Datentabelle ausschließen und ausblendenHallo,
Ich muss mehrere Datentabellen verwalten und möchte nur einen Filter verwenden. Idealerweise möchte ich alle Daten ausblenden und ausschließen, die nicht in einer anderen Datentabelle ausgewählt sind.
Ich habe eine modifizierte Version eines JSL-Codes von ian.cox@jmp.com verwendet, siehe unten zu JMP 17.0.0
// ian.cox@jmp.com: 03Nove2014
// Demo of how to link multiple child tables to a parent table using a row state handler
Names Default To Here( 1 );
// Make some tables to use
dt1 = New Table( "Table 1",
New Column( "ID", Numeric, Conntinuous, Values( (1 :: 10)` ) ),
New Column( "Response", Numeric, Continuous, Formula( Random Normal( 0, 1 ) ) )
);
dt1 << Set Name ("dt1 Master");
dt2 = New Table( "Table 2",
New Column( "ID", Numeric, Conntinuous, Formula( Random Integer( 1, 5 ) ) ),
New Column( "Attribute 2", Numeric, Continuous, Formula( Random Integer( 0, 10 ) ) ),
AddRows( 20 )
);
dt2 << Set Name("dt2 - slave");
dt3 = New Table( "Table 3",
New Column( "ID", Numeric, Conntinuous, Formula( Random Integer( 1, 11 ) ) ),
New Column( "Attribute 3", Numeric, Continuous, Formula( Random Integer( 0, 100 ) ) ),
AddRows( 30 )
);
dt3 << Set Name("dt3 - slave");
// Utility function:
// Given a data table, a column therein and some value(s) in that column, selects all corresponding rows.
// Need to allow for 'col' to be numeric (character), in which case 'vals' is a matrix (is a list).
selectMatchingRows =
Function( {dt, col, vals},
rows2select = [];
If( Is Matrix( vals ),
// 'col' is numeric
For( i = 1, i <= N Row( vals ), i++,
rows2select = V Concat( rows2select, dt << GetRowsWhere( col == vals[i] ) );
)
,
// 'col' is character
For( i = 1, i <= N Items( vals ), i++,
rows2select = V Concat( rows2select, dt << GetRowsWhere( col == vals[i] ) );
)
);
dt << Select Rows( rows2select ) << Hide << Exclude;
/*
dt << Exclude;
dt << Hide;
*/
);
// Make a row state handler to be assigned to the 'master' table (dt1). Allow for multiple row selections.
propagateSelectionToOtherTables =
Function( {x},
// Get the rows that have been selected
selectedRows = dt1 << GetSelectedRows;
If( N Row( selectedRows ) > 0,
// Clear any existing selection
dt2 << ClearSelect;
dt3 << ClearSelect;
// Get the corresponding IDs
IDs = dt1:ID[selectedRows];
// Select the corresponding rows in dt2
selectMatchingRows( dt2, Expr( :ID ), IDs );
// Select the corresponding rows in dt3
selectMatchingRows( dt3, Expr( :ID ), IDs );
);
);
// Assign the handler to dt1
rsh = dt1 << MakeRowStateHandler( propagateSelectionToOtherTables );
Dieser Code schließt die ausgewählten Daten ganz am Anfang aus (erste Auswahl in der Stammdatentabelle), jedoch nicht danach.
Gibt es eine Möglichkeit, diesen Code zu verbessern?
Vielen Dank im Voraus.
Antoine Carré
Automatisierung und SkriptingBetreff: Funktion „MakeRowStateHandler“: Alle Zeilen außer den ausgewählten in einer anderen Datentabelle ausschließen und verbergenIch habe einige Änderungen vorgenommen, damit der Code funktioniert. Allerdings ist der Code nicht sehr robust.
// ian.cox@jmp.com: 03Nove2014
// Demo of how to link multiple child tables to a parent table using a row state handler
Names Default To Here( 1 );
// Make some tables to use
dt1 = New Table( "Table 1",
New Column( "ID", Numeric, Conntinuous, Values( (1 :: 10)` ) ),
New Column( "Response", Numeric, Continuous, Formula( Random Normal( 0, 1 ) ) )
);
dt1 << Set Name( "dt1 Master" );
dt2 = New Table( "Table 2",
New Column( "ID", Numeric, Conntinuous, Formula( Random Integer( 1, 5 ) ) ),
New Column( "Attribute 2", Numeric, Continuous, Formula( Random Integer( 0, 10 ) ) ),
AddRows( 20 )
);
dt2 << Set Name( "dt2 - slave" );
dt3 = New Table( "Table 3",
New Column( "ID", Numeric, Conntinuous, Formula( Random Integer( 1, 11 ) ) ),
New Column( "Attribute 3", Numeric, Continuous, Formula( Random Integer( 0, 100 ) ) ),
AddRows( 30 )
);
dt3 << Set Name( "dt3 - slave" );
// Utility function:
// Given a data table, a column therein and some value(s) in that column, selects all corresponding rows.
// Need to allow for 'col' to be numeric (character), in which case 'vals' is a matrix (is a list).
selectMatchingRows =
Function( {dt, col, vals},
rows2select = [];
If( Is Matrix( vals ),
// 'col' is numeric
For( i = 1, i <= N Row( vals ), i++,
rows2select = V Concat( rows2select, dt << GetRowsWhere( col == vals[i] ) )
)
,
// 'col' is character
For( i = 1, i <= N Items( vals ), i++,
rows2select = V Concat( rows2select, dt << GetRowsWhere( col == vals[i] ) )
)
);
//dt << clear rowstates;
dt << Select Rows( rows2select ) << Hide(1) << Exclude(1);
dt << invert row selection;
dt << Hide(0) << Exclude(0);
dt << invert row selection;
/*
dt << Exclude;
dt << Hide;
*/
);
// Make a row state handler to be assigned to the 'master' table (dt1). Allow for multiple row selections.
propagateSelectionToOtherTables = Function( {x},
// Get the rows that have been selected
selectedRows = dt1 << GetSelectedRows;
If( N Row( selectedRows ) > 0,
// Clear any existing selection
dt2 << ClearSelect;
dt3 << ClearSelect;
// Get the corresponding IDs
IDs = dt1:ID[selectedRows];
// Select the corresponding rows in dt2
selectMatchingRows( dt2, Expr( :ID ), IDs );
// Select the corresponding rows in dt3
selectMatchingRows( dt3, Expr( :ID ), IDs );
,
If( N Row( dt2 << get selected rows ) > 0,
dt2 << Hide( 0 ) << exclude( 0 );
dt2 << clear select;
);
If( N Row( dt3 << get selected rows ) > 0,
dt3 << Hide( 0 ) << exclude( 0 );
dt3 << clear select;
);
);
);
// Assign the handler to dt1
rsh = dt1 << MakeRowStateHandler( propagateSelectionToOtherTables );Betreff: Funktion „MakeRowStateHandler“: Alle Zeilen außer den ausgewählten in einer anderen Datentabelle ausschließen und verbergenEs wurden zwar viele Annahmen getroffen, aber das könnte funktionieren
Names Default To Here(1);
dt1 = New Table("Table1",
New Column("ID", Numeric, Ordinal, Values((1 :: 10)`)),
New Column("Response", Numeric, Continuous, Formula(Random Normal(0, 1)))
);
dt2 = New Table("Table2",
New Column("ID", Numeric, Ordinal, Formula(Random Integer(1, 5))),
New Column("Attribute 2", Numeric, Ordinal, Formula(Random Integer(0, 10))),
AddRows(20)
);
dt3 = New Table("Table3",
New Column("ID", Numeric, Conntinuous, Formula(Random Integer(1, 11))),
New Column("Attribute 3", Numeric, Continuous, Formula(Random Integer(0, 100))),
AddRows(30)
);
set_states = function({dt, ids}, {Default Local},
rows_to_show = dt << Get Rows Where(Contains(sel_ids, :ID));
rstates = J(N Rows(dt), 1, 6);
rstates[rows_to_show] = 0;
dt << Set Row States(rstates);
);
Eval(EvalExpr(
handler = Function({a},
Try(
sel_rows = Expr(dt1) << Get Selected Rows;
sel_ids = Expr(dt1)[sel_rows, "ID"];
set_states(Expr(dt2), sel_ids);
set_states(Expr(dt3), sel_ids);
,
show(exception_msg);
);
);
));
rsh = dt1 << Make Row State Handler(handler);
/*
nw = New Window("demo",
H List Box(
Panel Box("Table1 (parent table)",
dt1 << new data box
),
V List Box(
Panel Box("Table 2 (child table)",
dt2 << new data box
),
Panel Box("Table 3 (child table)",
dt3 << new data box
)
)
)
);
*/
Eine Sache ist zu beachten: Zeilenzustände brechen sehr leicht. Je nachdem, was Sie versuchen, möchten Sie möglicherweise eine andere Lösung als den Zeilenzustandshandler verwenden.
Betreff: Funktion „MakeRowStateHandler“: Alle Zeilen außer den ausgewählten in einer anderen Datentabelle ausschließen und verbergenHallo,
Super, genau das, was ich gesucht habe. Vielen Dank für die Reaktionsfähigkeit und die Qualität der Antwort.
Beste grüße
Antoine