使过滤器更改处理程序()仅在第二次过滤器更改后触发,为什么不首先?我使用 Make Filter Change Handler () 根据用户对本地数据过滤器所做的更改动态更改 y 轴标题。 该脚本使用解决方案@hogi从这里. 但是,在我的示例案例(下面的脚本)中,它非常接近我的实际案例,只有在“年龄”上选中第二个复选框后,y 轴标题才会更改。 如何在第一次选择年龄时更改 y 轴图块(我使用的是 JMP 16.2.0)?
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
gb = Graph Builder(
Size( 855, 687 ),
Show Control Panel( 0 ),
Variables( X( :name ), Y( :age ), Group Y( :height ) ),
Elements( Points( X, Y, Legend( 37 ) ) ),
Local Data Filter(
Conditional,
Add Filter(
columns( :sex, :age ),
Where( :sex == "F" ),
Display( :sex, "Check Box Display" ),
Display( :age, "Check Box Display" )
)
),
SendToReport(
Dispatch( {}, "graph title", TextEditBox, {Set Text( "" )} ),
Dispatch( {}, "Y title", TextEditBox, {Rotate Text( "Left" )} )
)
);
ldf = Current Report()["Local Data Filter"] << get scriptable object;
changeTitle = Function( {this},
print(this);
ldfText = Regex(ldf << get where clause(),"\( *(:age == .*?)\)","\1");
if(ismissing(ldfText),ldfText = "all ages");
(Report( gb ) << XPath( "//TextEditBox" ))[4] << Set Text( ldfText );
);
fsh = ldf << Make Filter Change Handler(
changeTitle();
);自动化和脚本回复:仅在第二次过滤器更改后才触发 Filter Change Handler (),为什么不首先?如果只选择一个年龄,则使用的正则表达式将不起作用,并且会导致“所有年龄”。
仅选择一个年龄时的 Where 子句
"Select Where(:sex == \!"F\!" & :age == 15)"
选择多个年龄时的 Where 子句:
"Select Where(:sex == \!"F\!" & (:age == 14 | :age == 15))"
您将不得不对正则表达式模式进行轻微修改
编辑:
这样的事情可能会奏效https://regex101.com/r/Z6pg9N/1
回复:使 Filter Change Handler () 仅在第二次过滤器更改后触发,为什么不先触发?@jthi以下似乎适用于我上面的示例案例
ldfText = Regex(ldf << get where clause(),"\(?\s*(:age == .*?)\)","\1");
然而,对于我的实际情况,只有当 Graph Builder() 内的 Add Filter() 默认选中的复选框首先取消选中然后重新选中时,上述脚本更改才有效。 一旦统计工作正常,一切顺利。 可能出什么问题了?
回复:使 Filter Change Handler () 仅在第二次过滤器更改后触发,为什么不先触发?最有可能的是,第一个过滤器状态在添加过滤器状态处理程序之前运行。 您可以调用changeTitle()并引用本地数据过滤器,以确保该函数在创建图形后运行一次
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
gb = Graph Builder(
Size( 855, 687 ),
Show Control Panel( 0 ),
Variables( X( :name ), Y( :age ), Group Y( :height ) ),
Elements( Points( X, Y, Legend( 37 ) ) ),
Local Data Filter(
Conditional,
Add Filter(
columns( :sex, :age ),
Where( :sex == "F" ),
Where(:age == 12),
Display( :sex, "Check Box Display" ),
Display( :age, "Check Box Display" )
)
),
SendToReport(
Dispatch( {}, "graph title", TextEditBox, {Set Text( "" )} ),
Dispatch( {}, "Y title", TextEditBox, {Rotate Text( "Left" )} )
)
);
ldf = Current Report()["Local Data Filter"] << get scriptable object;
changeTitle = Function( {this},
print(this);
ldfText = Regex(ldf << get where clause(),"\(?\s*(:age == .*?)\)","\1");
if(ismissing(ldfText),ldfText = "all ages");
(Report( gb ) << XPath( "//TextEditBox" ))[4] << Set Text( ldfText );
);
changeTitle(ldf); // to run the changeTitle() function once
fsh = ldf << Make Filter Change Handler(
changeTitle();
);回复:使 Filter Change Handler () 仅在第二次过滤器更改后触发,为什么不先触发?@jthi . 调用 Change Title () 作为您的脚本并没有改变任何内容。 不幸的是我无法分享我的实际脚本(:.
请注意,第一次选择会在 y 轴上显示所有选中的过滤器。 也许这可以为正在发生的事情提供线索。
取消选中所有复选框并根据需要重新选中它们会产生预期结果。
任何建议都会非常有用。
回复:使 Filter Change Handler () 仅在第二次过滤器更改后触发,为什么不先触发?不知道。 您将必须创建某种能够复制问题以使调试更容易的模型