使過濾器更改處理程序()僅在第二次過濾器更改後觸發,為什麼不首先?我使用 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 () 僅在第二次過濾器更改後觸發,為什麼不先觸發?不知道。 您將必須創建某種能夠複製問題以使調試更容易的模型