안녕하세요,
List Box()에서 데이터 테이블의 일부 범주형 요소를 선택하도록 사용자에게 요청하기 위해 New Window()를 표시하려고 합니다.
이 선택에 대해 더 많은 통찰력을 추가하기 위해 다음 사항을 강조하고 싶습니다.
- 각 요인별 레벨 수
- 각 요인 열 내 빈 셀의 비율을 표시하는 색상
제가 성취하고 싶은 것의 예를 첨부된 것을 참조하세요.
다음 스크립트에서는 각 요소에 대한 정보를 계산하고 "Value" 목록을 채웁니다.
하지만 이 정보를 사용하여 List Box()의 디자인에 접근하는 방법을 모르겠습니다.
도움을 주셔서 감사합니다
- 설교자

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는 가장 유연한 디스플레이 상자가 아니며 txnelson이 Table Box를 사용할 수 있다는 데 동의합니다. 아래는 한 가지 예입니다.
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);

안녕하세요 Jarmo님,
저는 이 솔루션이 정말 마음에 듭니다.(제안해 주신 짐에게도 감사드립니다.)
제가 고려해야 할 한 가지는 수십 가지의 요소가 있을 수 있다는 사실입니다.
Table Box()에 고정 높이를 강제로 적용하는 방법이 있나요?
예를 들어, 보이는 행을 5개만 만들고, 더 많은 사용자 입력(라디오 상자, 체크 상자 등)을 추가하기 위해 고정된 높이로 스크롤할 수 있는 기능이 있습니다.
아래는 더 많은 행이 있고 모든 행이 표시되는 Table Box()의 예입니다(훨씬 더 많은 요소가 있는 경우 문제가 됩니다)
정말 감사합니다
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);