Ciao,
Sto provando a visualizzare una nuova finestra (New Window()) per richiedere all'utente di selezionare alcuni fattori categoriali da una tabella dati in una casella di riepilogo (List Box()).
Vorrei aggiungere ulteriori approfondimenti a questa scelta, evidenziando:
- il numero di livelli per ogni fattore
- un colore per mostrare il rapporto delle celle vuote all'interno di ogni colonna di fattori
vedi allegato un esempio di ciò che vorrei ottenere.
Nello script seguente calcolo le informazioni per ciascun fattore e popola un elenco "Valore" .
Ma poi non so come approcciare il design della List Box () con queste informazioni
Grazie per l'aiuto
- il predicatore

Names Default To Here( 1 );
clear symbols();
Deletesymbols();
dt = New Table( "RawData",
Add Rows( 20 ),
New Column("factor1", Character, set values( {"A","A","A","A","A","A","A","B","B","B","B","B","B","C","C","C","C","C","C","C"})),
New Column("factor2", Character, set values( {"T0","DROP1","DROP2","DROP3","DROP4","DROP5","DROP6","T0","DROP1","DROP2","DROP3","DROP4","DROP5","T0","DROP1","DROP2","DROP3","DROP4","DROP5", "DROP6"})),
New Column("factor3", Character, set values({"1","1","1","2","2","", ,"","","" ,"" ,"", "","3","3","3","3"}) ),
New Column("factor4", Character, set values({"a","a","a", "", "", "a", "a", "a", "a", "a", "a", "b", "b", "b", "b" , "b", "b", "b", "b"}) );
);
RawDataCol = dt << get column names ("character");
show (RawDataCol);
for(i=1, i<= N items (RawDataCol), i++,
FactorSummary = {};
Eval(Eval Expr(FactorSummary = Column(dt, Expr(char(RawDataCol[i]))) << get values));
//show (FactorSummary);
//find cell count (non empty)
Eval(Eval Expr(For( j = N Items(FactorSummary), j > 0, j--,
If( FactorSummary[j] == "",
Remove From( FactorSummary, j, 1 )
)
)));
//Find number of level within a factor (non empty)
Eval(Eval Expr(Summarize( LevelSummary = by(Column(dt, Expr(char(RawDataCol[i])))) )));
Eval(Eval Expr(For( j = N Items(LevelSummary), j > 0, j--,
If( LevelSummary[j] == "",
Remove From( LevelSummary, j, 1 )
)
)));
//show (LevelSummary);
Eval(Eval Expr(Value = {Expr(RawDataCol[i]), Expr(N items(LevelSummary)), Expr(N items (FactorSummary) / N row(dt))}));
show (Value);
);
MainWindow = New Window( "Select Factors",
<<MODAL></MODAL>List Box non è la casella di visualizzazione più flessibile e sono d'accordo con txnelson che potresti usare Table Box. Di seguito un esempio
Names Default To Here(1);
dt = New Table("RawData",
Add Rows(20),
New Column("factor1",
Character,
set values({"A", "A", "A", "A", "A", "A", "A", "B", "B", "B", "B", "B", "B", "C", "C", "C", "C", "C", "C", "C"})
),
New Column("factor2",
Character,
set values(
{"T0", "DROP1", "DROP2", "DROP3", "DROP4", "DROP5", "DROP6", "T0", "DROP1", "DROP2", "DROP3", "DROP4", "DROP5", "T0", "DROP1", "DROP2",
"DROP3", "DROP4", "DROP5", "DROP6"}
)
),
New Column("factor3", Character, set values({"1", "1", "1", "2", "2", "", , "", "", "", "", "", "", "3", "3", "3", "3"})),
New Column("factor4", Character, set values({"a", "a", "a", "", "", "a", "a", "a", "a", "a", "a", "b", "b", "b", "b", "b", "b", "b", "b"}))
);
cols = dt << get column names("character", "string");
factors = {};
factor_counts = {};
missing_perc = {};
For Each({colname}, cols,
Summarize(dt, uniq = by(Eval(colname)));
Remove From(uniq, Contains(uniq, ""));
nvalues = Col Number(Column(dt, colname));
Insert Into(factors, colname);
Insert Into(factor_counts, N Items(uniq));
Insert Into(missing_perc, (nvalues)/ N Rows(dt));
);
dt_factors = New Table("Demo",
Add Rows(N Items(factors)),
New Column("Factor", Character, Nominal, Values(factors)),
New Column("Count", Numeric, Continuous, Values(factor_counts)),
New Column("% Non-missing", Numeric, Continuous, Format("Percent", 12, 3), Values(missing_perc)),
Invisible
);
orange_rows = dt_factors << Get Rows Where(:"% Non-missing"n < 0.5);
yellow_rows = dt_factors << Get Rows Where(0.5 < :"% Non-missing"n < 0.9);
For Each({colname}, dt_factors << Get Column Names("String"),
Column(dt_factors, colname) << Color Cells("Green");
Column(dt_factors, colname) << Color Cells("Orange", orange_rows);
Column(dt_factors, colname) << Color Cells("Yellow", yellow_rows);
);
nw = New Window("Select",
H List Box(
Panel Box("Select factors to run the analysis",
bb = dt_factors << get as report
),
Panel Box("Actions",
Lineup Box(N Col(1),
Button Box("OK",
tb = bb << child;
sel_rows = tb << get selected rows;
show(sel_rows, tb[1][sel_rows]);
),
Button Box("Cancel", << Set Function(function({this}, this << close window))),
)
)
)
);
Close(dt_factors, no save);

Ciao Jarmo,
Questa soluzione mi piace molto (grazie anche a Jim per il suggerimento).
Una cosa di cui devo tenere conto è il fatto che potrei avere a che fare con decine di fattori.
Esiste un modo per forzare un'altezza fissa per Table Box()?
Ad esempio, solo 5 righe visibili e la possibilità di scorrere verso il basso per avere un'altezza fissa, in modo da aggiungere ulteriori input utente (casella di scelta, casella di controllo, ecc.).
Di seguito un esempio di Table Box () con più righe e tutte visibili (diventerà un problema con molti più fattori)
Molte grazie
Names Default To Here(1);
dt = New Table("RawData",
Add Rows(20),
New Column("factor1",
Character,
set values({"A", "A", "A", "A", "A", "A", "A", "B", "B", "B", "B", "B", "B", "C", "C", "C", "C", "C", "C", "C"})
),
New Column("factor2",
Character,
set values(
{"T0", "DROP1", "DROP2", "DROP3", "DROP4", "DROP5", "DROP6", "T0", "DROP1", "DROP2", "DROP3", "DROP4", "DROP5", "T0", "DROP1", "DROP2",
"DROP3", "DROP4", "DROP5", "DROP6"}
)
),
New Column("factor3", Character, set values({"1", "1", "1", "2", "2", "", , "", "", "", "", "", "", "3", "3", "3", "3"})),
New Column("factor4", Character, set values({"a", "a", "a", "", "", "a", "a", "a", "a", "a", "a", "b", "b", "b", "b", "b", "b", "b", "b"})),
New Column("factor5", Character, set values({"a", "a", "a", "", "", "a", "a", "a", "a", "a", "a", "b", "b", "b", "b", "b", "b", "b", "b"})),
New Column("factor6", Character, set values({"a", "a", "a", "", "", "a", "a", "a", "a", "a", "a", "b", "b", "b", "b", "b", "b", "b", "b"})),
New Column("factor7", Character, set values({"a", "a", "a", "", "", "a", "a", "a", "a", "a", "a", "b", "b", "b", "b", "b", "b", "b", "b"})),
New Column("factor8", Character, set values({"a", "a", "a", "", "", "a", "a", "a", "a", "a", "a", "b", "b", "b", "b", "b", "b", "b", "b"})),
New Column("factor9", Character, set values({"a", "a", "a", "", "", "a", "a", "a", "a", "a", "a", "b", "b", "b", "b", "b", "b", "b", "b"})),
New Column("factor10", Character, set values({"a", "a", "a", "", "", "a", "a", "a", "a", "a", "a", "b", "b", "b", "b", "b", "b", "b", "b"})),
New Column("factor12", Character, set values({"a", "a", "a", "", "", "a", "a", "a", "a", "a", "a", "b", "b", "b", "b", "b", "b", "b", "b"})),
New Column("factor13", Character, set values({"a", "a", "a", "", "", "a", "a", "a", "a", "a", "a", "b", "b", "b", "b", "b", "b", "b", "b"})),
New Column("factorA", Character, set values({"a", "a", "a", "", "", "a", "a", "a", "a", "a", "a", "b", "b", "b", "b", "b", "b", "b", "b"})),
New Column("factorB", Character, set values({"a", "a", "a", "", "", "a", "a", "a", "a", "a", "a", "b", "b", "b", "b", "b", "b", "b", "b"})),
New Column("factorB1", Character, set values({"a", "a", "a", "", "", "a", "a", "a", "a", "a", "a", "b", "b", "b", "b", "b", "b", "b", "b"})),
New Column("factorC", Character, set values({"a", "a", "a", "", "", "a", "a", "a", "a", "a", "a", "b", "b", "b", "b", "b", "b", "b", "b"})),
New Column("factorD", Character, set values({"a", "a", "a", "", "", "a", "a", "a", "a", "a", "a", "b", "b", "b", "b", "b", "b", "b", "b"})),
New Column("factor69", Character, set values({"a", "a", "a", "", "", "a", "a", "a", "a", "a", "a", "b", "b", "b", "b", "b", "b", "b", "b"})),
New Column("factor67", Character, set values({"a", "a", "a", "", "", "a", "a", "a", "a", "a", "a", "b", "b", "b", "b", "b", "b", "b", "b"})),
New Column("factor47", Character, set values({"a", "a", "a", "", "", "a", "a", "a", "a", "a", "a", "b", "b", "b", "b", "b", "b", "b", "b"})),
New Column("factor56", Character, set values({"a", "a", "a", "", "", "a", "a", "a", "a", "a", "a", "b", "b", "b", "b", "b", "b", "b", "b"}))
);
cols = dt << get column names("character", "string");
factors = {};
factor_counts = {};
missing_perc = {};
For Each({colname}, cols,
Summarize(dt, uniq = by(Eval(colname)));
Remove From(uniq, Contains(uniq, ""));
nvalues = Col Number(Column(dt, colname));
Insert Into(factors, colname);
Insert Into(factor_counts, N Items(uniq));
Insert Into(missing_perc, (nvalues)/ N Rows(dt));
);
dt_factors = New Table("Demo",
Add Rows(N Items(factors)),
New Column("Factor", Character, Nominal, Values(factors)),
New Column("Count", Numeric, Continuous, Values(factor_counts)),
New Column("% Non-missing", Numeric, Continuous, Format("Percent", 12, 3), Values(missing_perc)),
Invisible
);
orange_rows = dt_factors << Get Rows Where(:"% Non-missing"n < 0.5);
yellow_rows = dt_factors << Get Rows Where(0.5 < :"% Non-missing"n < 0.9);
For Each({colname}, dt_factors << Get Column Names("String"),
Column(dt_factors, colname) << Color Cells("Green");
Column(dt_factors, colname) << Color Cells("Orange", orange_rows);
Column(dt_factors, colname) << Color Cells("Yellow", yellow_rows);
);
nw = New Window("Select",
H List Box(
Panel Box("Select factors to run the analysis",
bb = dt_factors << get as report
),
Panel Box("Actions",
Lineup Box(N Col(1),
Button Box("OK",
tb = bb << child;
sel_rows = tb << get selected rows;
show(sel_rows, tb[1][sel_rows]);
),
Button Box("Cancel", << Set Function(function({this}, this << close window))),
)
)
)
);
Close(dt_factors, no save);