Fonction MakeRowStateHandler : exclure et masquer toutes les lignes sauf celles sélectionnées dans différentes tables de donnéesSalut,
Je dois gérer plusieurs tableaux de données et je souhaiterais utiliser un seul filtre. Idéalement, je souhaiterais masquer et exclure toutes les données qui ne sont pas sélectionnées dans différents tableaux de données.
J'ai utilisé une version modifiée d'un code JSL créé par ian.cox@jmp.com, voir ci-dessous sur 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 );
Ce code exclut les données sélectionnées au tout début (première sélection dans la table de données principale) mais pas par la suite.
Existe-t-il un moyen d’améliorer ce code ?
D'avance merci.
Antoine Carré
Automatisation et scriptsRe : Fonction MakeRowStateHandler : exclure et masquer toutes les lignes sauf celles sélectionnées dans différentes tables de donnéesJ'ai apporté quelques modifications pour que le code fonctionne. Cependant, ce n'est pas un code très robuste.
// 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 );Re : Fonction MakeRowStateHandler : exclure et masquer toutes les lignes sauf celles sélectionnées dans différentes tables de donnéesDe nombreuses hypothèses ont été faites, mais cela pourrait fonctionner
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
)
)
)
);
*/
Une chose à noter : les états de ligne se cassent très facilement. Selon ce que vous essayez de faire, vous souhaiterez peut-être utiliser une autre solution que le gestionnaire d'états de ligne
Re : Fonction MakeRowStateHandler : exclure et masquer toutes les lignes sauf celles sélectionnées dans différentes tables de donnéesSalut,
Super exactement ce que je recherchais. Merci beaucoup pour la réactivité et la qualité de la réponse.
Cordialement
Antoine