フィルター変更ハンドラー () を 2 回目のフィルター変更後にのみトリガーするようにします。なぜ最初にしないのでしょうか?Make Filter Change Handler () を使用して、ローカル データ フィルターに対してユーザーが行った変更に基づいて y 軸のタイトルを動的に変更します。 スクリプトは次のソリューションを使用します@ほぎからここ。 ただし、実際のケースに近い例のケース (以下のスクリプト) では、y 軸のタイトルは、「年齢」の 2 番目のチェックボックスがオンになった後にのみ変更されます。 最初の年齢選択時に 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();
);自動化とスクリプト作成Re: フィルター変更ハンドラー () を 2 回目のフィルター変更後にのみトリガーするようにします。なぜ最初にしないのですか?使用されている正規表現は、年齢が 1 つだけ選択されている場合には機能せず、「すべての年齢」という結果になります。
年齢を 1 つだけ選択した場合の Where 句
"Select Where(:sex == \!"F\!" & :age == 15)"
複数の年齢が選択されている場合の Where 句:
"Select Where(:sex == \!"F\!" & (:age == 14 | :age == 15))"
正規表現パターンに若干の変更を加える必要があります
編集:
このようなものが機能するかもしれませんhttps://regex101.com/r/Z6pg9N/1
Re: フィルター変更ハンドラー () を 2 回目のフィルター変更後にのみトリガーするようにします。なぜ最初にしないのですか?@jthi上記の例では、以下が機能するようです
ldfText = Regex(ldf << get where clause(),"\(?\s*(:age == .*?)\)","\1");
ただし、私の実際のケースでは、上記のスクリプトの変更は、Graph Builder() 内の Add Filter () によってデフォルトで選択されているチェックボックスが最初にオフになってから再度チェックされた場合にのみ機能します。 統計が機能していることが確認されたら、問題なければ大丈夫です。 何が間違っているのでしょうか?
Re: フィルター変更ハンドラー () を 2 回目のフィルター変更後にのみトリガーするようにします。なぜ最初にしないのですか?ほとんどの場合、最初のフィルター状態は、フィルター状態ハンドラーが追加される前に実行されます。 ローカル データ フィルターへの参照を指定して changeTitle() を呼び出して、グラフの作成後に関数が 1 回実行されるようにすることができます。
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();
);Re: フィルター変更ハンドラー () を 2 回目のフィルター変更後にのみトリガーするようにします。なぜ最初にしないのですか?@jthi 。 スクリプトとして Change Title () を呼び出しても何も変わりません。 残念ながら、実際のスクリプトを共有することはできません (:.
初めて選択すると、チェックされたすべてのフィルターが Y 軸に表示されることに注意してください。 おそらくこれは何が起こっているのかについてのヒントを提供するかもしれません。
すべてのチェックボックスをオフにし、必要に応じて再度チェックすると、期待どおりの結果が得られます。
あらゆる提案が非常に役立ちます。
Re: フィルター変更ハンドラー () を 2 回目のフィルター変更後にのみトリガーするようにします。なぜ最初にしないのですか?わかりません。 デバッグを容易にするために、問題を再現できる何らかのモックアップを作成する必要があります。