图形循环中的Where子句我有一些代码旨在根据某些过滤构建报告。它将被提供两个列表,第一个列表将确定提取哪些材质(在本例中为 Gender_List),第二个列表确定绘制哪些属性(在本例中为 Property_List)。这个想法是,每个性别都会有一个循环,为所有选定的属性创建一个图形矩阵。报告顶部还有一个未经过滤的总体图表
有两种方法可以做到这一点。
第一个在图表中带有内在的 where 子句。我基本上已经让它工作了,除了Where 子句最终占据了排队框中的一个位置。 另外,出于某种原因,在我下面的模型中,我有一个我不完全理解的错误(我的完整版本没有该错误,但如果有人知道如何修复它,我仍然会感到好奇)。这是模型代码
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Gender_List = {"M","F"};
age_list = {12,13,14,15};
Property_List = {"Age", "Height", "Weight"};
w= new window("test",
VLB = V List Box ("A",
dt<<DISTRIBUTION></DISTRIBUTION>
第二个是数据过滤器上下文框,它包装了图形循环的每次迭代。那个我还没能去上班。如果我能让上面的 where 版本正常工作,我认为我不需要太担心数据过滤器上下文框/包装。
无论如何,关于如何清理上面的代码以从行框中删除那些Where子句有什么想法吗?
消费者和市场研究内容组织数据探索和可视化实验设计大规模定制回复:图形循环中的Where子句如果将来有人遇到这个问题,我可以使用数据过滤器版本来解决问题。问题是数据过滤器上下文框需要有一个它所包装的对象。就像我在上面展示的那样,盒子包裹了阵容盒子和数据过滤器。这导致了奇怪的行为。通过将 LineupBox 和 Data 过滤器包装到同一个对象(HListBox)中,似乎可以解决问题:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Gender_List = {"M", "F"};
age_list = {12, 13, 14, 15};
Property_List = {"Age", "Height", "Weight"};
w = New Window( "test", VLB = V List Box( Text Box( "A" ),
dt << Graph Builder(Size( 534, 450 ),
Show Control Panel( 0 ),
Variables( X( :age ) ),
Elements( Histogram( X, Legend( 6 ) ) )
)
)
);
For( j = 1, j <= N Items( Gender_List ), j++,
VLB << Append( Text Box( Gender_List[j] ) );
VLB << Append(
data filter context box(
HLB = HlistBox(
LB = Lineup Box( N Col( 2 ), spacing( 10 ),
For( i = 1, i <= N Items( Property_List ), i++,
gb = dt << Graph Builder(
Size( 534, 450 ),
Show Control Panel(0 ),
Show Legend(0),
Variables( X(Column( Property_List[i] ) )),
Elements( Histogram( X, Legend( 6 ) ) ),
/*Where( :Sex == Gender_List[j] ) ),*/
SendToReport(
Dispatch(
{},
"Graph Builder",
OutlineBox,
{Set Title( Property_List[i] ), Image Export Display( Normal )}
)
)
),
)
),
dt<<DATA filter=""></DATA>回复:图形循环中的Where子句很好,谢谢。我尝试将其放入脚本中,但没有使其正常工作,但看起来它位于错误的位置。我还注意到本地数据过滤器包装存在一些重大性能问题,因此我认为这将是我们想要走的路线。
感谢大家对这一问题的帮助。
回复:图形循环中的Where子句如果你添加@jthi代码到我提供的代码,它会给你你想要的

Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Gender_List = {"M", "F"};
age_list = {12, 13, 14, 15};
Property_List = {"Age", "Height", "Weight"};
w = New Window( "test", VLB = V List Box( Text Box( "A" ), dt << Distribution( Nominal Distribution( Column( :age ) ) ) ) );
For( j = 1, j <= N Items( Gender_List ), j++,
VLB << Append( Text Box( Gender_List[j] ) );
VLB << Append(
LB = LB = Lineup Box( N Col( 2 ), spacing( 10 ),
For( i = 1, i <= N Items( Property_List ), i++,
gb = dt << Distribution( Continuous Distribution( Column( Property_List[i] ) ), where( :Sex == Gender_List[j] ) )
)
)
);
);
whereTb = w << XPath("//TextBox[contains(text(), 'Where(:sex == Gender_List[j])')]");
whereTb << Delete;回复:图形循环中的Where子句似乎仍然无法弄清楚如何摆脱阵容框中的“where”子句。我将其切换到图形生成器对象,以查看页眉/页脚首选项是否会删除它,但似乎没有这样做。
我尝试将其重写为包装 LB 的数据过滤器。无论如何,这有一些优点,因为它允许用户进行一些定制。这似乎然而,正如您所看到的,它看起来有点奇怪,因为数据过滤器难以置信地折叠了。
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Gender_List = {"M", "F"};
age_list = {12, 13, 14, 15};
Property_List = {"Age", "Height", "Weight"};
w = New Window( "test", VLB = V List Box( Text Box( "A" ),
dt << Graph Builder(Size( 534, 450 ),
Show Control Panel( 0 ),
Variables( X( :age ) ),
Elements( Histogram( X, Legend( 6 ) ) )
)
)
);
For( j = 1, j <= N Items( Gender_List ), j++,
VLB << Append( Text Box( Gender_List[j] ) );
VLB << Append(
data filter context box(
LB = LB = Lineup Box( N Col( 2 ), spacing( 10 ),
For( i = 1, i <= N Items( Property_List ), i++,
gb = dt << Graph Builder(
Size( 534, 450 ),
Show Control Panel(0 ),
Variables( X(Column( Property_List[i] ) )),
Elements( Histogram( X, Legend( 6 ) ) ),
/*Where( :Sex == Gender_List[j] ) ),*/
),
)
),
dt<<DATA filter=""></DATA>
我尝试在 LB 顶部加载数据过滤器,但这似乎不起作用。
关于如何清理这个有什么想法吗?这在技术上可行,但看起来有点垃圾。
回复:图形循环中的Where子句这个怎么样:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Gender_List = {"M", "F"};
age_list = {12, 13, 14, 15};
Property_List = {"Age", "Height", "Weight"};
w = New Window( "test", VLB = V List Box( Text Box( "A" ), dt << Distribution( Nominal Distribution( Column( :age ) ) ) ) );
For( j = 1, j <= N Items( Gender_List ), j++,
VLB << Append( Text Box( Gender_List[j] ) );
VLB << Append(
LB = Lineup Box( N Col( 2 ), spacing( 10 ),
For( i = 1, i <= N Items( Property_List ), i++,
eval(substitute(
expr(dt << Distribution( Continuous Distribution( Column( _col_ ) ), where( :Sex == _select_) )),
expr(_col_),Property_List[i],
expr(_select_), Gender_List[j]
))
);
);
);
);回复:图形循环中的Where子句您可以在脚本末尾使用以下命令删除它们:
whereTb = w << XPath("//TextBox[contains(text(), 'Where(:sex == Gender_List[j])')]");
whereTb << Delete;但在这种情况下,我猜它不会有帮助,因为 Lineup 似乎那些文本框作为元素,并且在删除它们之前窗口会变得混乱。
回复:图形循环中的Where子句这绝对是一个重大改进,但看起来我仍然在阵容框中显示悬挂的“where(:Sex == Gender_List[j]”子句。 知道如何杀死它吗?回复:图形循环中的Where子句我稍微修改了一下你的脚本。您的代码中的一些递归追加不起作用。看看这是否能满足您的需求
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Gender_List = {"M", "F"};
age_list = {12, 13, 14, 15};
Property_List = {"Age", "Height", "Weight"};
w = New Window( "test", VLB = V List Box( Text Box( "A" ), dt << Distribution( Nominal Distribution( Column( :age ) ) ) ) );
For( j = 1, j <= N Items( Gender_List ), j++,
VLB << Append( Text Box( Gender_List[j] ) );
VLB << Append(
LB = LB = Lineup Box( N Col( 2 ), spacing( 10 ),
For( i = 1, i <= N Items( Property_List ), i++,
gb = dt << Distribution( Continuous Distribution( Column( Property_List[i] ) ), where( :Sex == Gender_List[j] ) )
)
)
);
);