MakeRowStateHandler 関数: 異なるデータ テーブル上の選択された行以外をすべて除外して非表示にするこんにちは、
複数のデータ テーブルを処理する必要があり、フィルターを 1 つだけ使用したいと考えています。理想的には、異なるデータ テーブルで選択されていないすべてのデータを非表示にして除外したいと思います。
私はian.cox@jmp.comが作成したJSLコードの修正版を使用しました。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 );
このコードは、最初に選択されたデータ (マスター データ テーブルの最初の選択) を除外しますが、それ以降は除外しません。
このコードを改善する方法はありますか?
よろしくお願いします。
アントワーヌ・カレ
自動化とスクリプトRe: MakeRowStateHandler 関数: 異なるデータ テーブル上の選択された行以外をすべて除外して非表示にするコードを動作させるためにいくつか変更を加えました。ただし、あまり堅牢なコードではありません。
// 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: MakeRowStateHandler 関数: 異なるデータ テーブル上の選択された行以外をすべて除外して非表示にするかなり多くの仮定が立てられているが、これはうまくいくかもしれない
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
)
)
)
);
*/
1つ注意すべき点: 行状態は非常に簡単に壊れます。何をしようとしているかに応じて、行状態ハンドラー以外のソリューションを使用することをお勧めします。
Re: MakeRowStateHandler 関数: 異なるデータ テーブル上の選択された行以外をすべて除外して非表示にするこんにちは、
まさに私が探していたものです。迅速な対応と質の高い回答に感謝します。
よろしくお願いします
アントワーヌ