두 번째 필터 변경 후에만 필터 변경 처리기()가 트리거되도록 합니다. 첫 번째가 아닌 이유는 무엇입니까?필터 변경 처리기 만들기()를 사용하여 로컬 데이터 필터에서 사용자가 변경한 내용을 기반으로 y축 제목을 동적으로 변경합니다. 스크립트는 솔루션을 다음과 같이 사용합니다. @호기 ~에서 여기 . 그러나 내 실제 사례를 밀접하게 나타내는 예제 사례(아래 스크립트)에서 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();
);자동화 및 스크립팅Re: 두 번째 필터 변경 후에만 필터 변경 처리기()가 트리거되도록 합니다. 첫 번째는 왜 안 됩니까?사용 중인 정규식은 선택한 연령이 하나만 있는 경우 작동하지 않으며 "모든 연령"이 됩니다.
연령이 하나만 선택된 경우의 Where 절
"Select Where(:sex == \!"F\!" & :age == 15)"
둘 이상의 연령이 선택된 경우 Where 절:
"Select Where(:sex == \!"F\!" & (:age == 14 | :age == 15))"
정규식 패턴을 약간 수정해야 합니다.
편집하다:
이와 같은 것이 작동 할 수 있습니다 https://regex101.com/r/Z6pg9N/1
Re: 두 번째 필터 변경 후에만 필터 변경 처리기()가 트리거되도록 합니다. 첫 번째는 왜 안 됩니까?@jthi 다음은 위의 예제 사례에서 작동하는 것으로 보입니다.
ldfText = Regex(ldf << get where clause(),"\(?\s*(:age == .*?)\)","\1");
그러나 내 실제 사례에서 위의 스크립트 변경은 Graph Builder() 내부의 Add Filter()에 의해 기본적으로 선택된 확인란이 먼저 선택 취소된 다음 다시 선택되는 경우에만 작동합니다. 작동 상태가 되면 모든 것이 정상입니다. 무엇이 잘못되었을 수 있습니까?
Re: 두 번째 필터 변경 후에만 필터 변경 처리기()가 트리거되도록 합니다. 첫 번째는 왜 안 됩니까?필터 상태 핸들러가 추가되기 전에 첫 번째 필터 상태가 실행될 가능성이 높습니다. 로컬 데이터 필터에 대한 참조로 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();
);Re: 두 번째 필터 변경 후에만 필터 변경 처리기()가 트리거되도록 합니다. 첫 번째는 왜 안 됩니까?@jthi . 스크립트가 아무 것도 변경하지 않았기 때문에 Change Title()을 호출합니다. 안타깝게도 실제 스크립트(:.
처음 선택하면 y축에 선택된 모든 필터가 표시됩니다. 아마도 이것은 무슨 일이 일어나고 있는지에 대한 힌트를 제공할 수 있습니다.
모든 확인란의 선택을 취소하고 원하는 대로 다시 선택하면 예상한 결과가 나타납니다.
모든 제안은 매우 유용합니다.
Re: 두 번째 필터 변경 후에만 필터 변경 처리기()가 트리거되도록 합니다. 첫 번째는 왜 안 됩니까?몰라. 디버깅을 더 쉽게 하기 위해 문제를 복제할 수 있는 일종의 모형을 만들어야 합니다.