테이블 목록: 대화식으로 업데이트하고 선택 항목을 잃지 않는 방법이 주제에 대한 토론을 보았지만 해결책을 찾지 못했습니다.
문제는 다음과 같습니다.
목록 상자에 표시되는 테이블 목록으로 작업하고 있습니다. 모든 테이블의 이름 목록을 가져오는 N Table() 방법을 사용합니다.
내가 원하는 것은 해당 목록에서 행을 선택하기 위해 클릭하면 목록 자체가 업데이트되고 새로 열린 테이블이 있거나 일부 테이블이 닫혀 있는지 확인하는 것입니다.
클릭하여 선택할 때마다 Set Items(openDTs)를 사용하는 것이 좋습니다. 테이블 목록을 잘 업데이트합니다. 문제는 선택 항목을 삭제한다는 것입니다.
목록 상자에서 Append(openDT)를 사용하면 열린 새 테이블이 추가되지만 테이블을 닫으면 닫힌 테이블이 삭제되지 않습니다.
선택이 유지되도록 목록을 클릭할 때 열린 테이블과 닫힌 테이블을 반영하여 테이블 목록을 업데이트하는 가장 우아하고 올바른 방법은 무엇입니까?
Re: 테이블 목록: 대화식으로 업데이트하고 선택을 느슨하게 하지 않는 방법미구엘로,
Kevin Anderson은 이 링크의 토론에서 우리 책 JSL Companion 2판의 스크립트를 게시했습니다.
목록을 비교하지만 부분 문자열을 사용합니다.
따라서 목록 상자에서 선택한 항목의 목록을 반환하는 첫 번째 함수를 수정하는 것이 좋습니다. 그런 다음 포함된 Lfunc() 함수를 사용하거나 현재 테이블 목록인 ctbls와 선택한 목록의 교차점을 찾는 교차 함수를 사용합니다. 결과 목록은 선택해야 하는 목록이 됩니다. 이 링크는 연관 배열을 사용하여 교차점을 찾거나 5장의 첨부된 스크립트를 보기 위해 사용하는 간단한 기술을 설명합니다. uniq_intersect(ctbls, 판매자) .
나는 그것이 분명하기를 바랍니다. 나는 당신의 다른 기능이 너무 가깝기 때문에 어제 더 추가하지 않았습니다.
Re: 테이블 목록: 대화식으로 업데이트하고 선택을 느슨하게 하지 않는 방법고마워, 조지아!
이것은 확실히 최신 테이블 목록을 갖는 보다 우아한 방법입니다. 유일한 작은 질문은 - 선택 항목을 잃지 않고 선택된 항목으로 목록 상자를 업데이트하는 가장 좋은 방법은 무엇입니까?
Re: 테이블 목록: 대화식으로 업데이트하고 선택을 느슨하게 하지 않는 방법미구엘로,
JMP 14를 사용하는 경우 열린 데이터 테이블 목록을 반환하는 새로운 명령 Get Data Table List()가 있습니다. JMP 14를 사용하지 않는 경우 N Table() 명령이 필요합니다.
또한 데이터 테이블 목록 구독(, OnOpen() | OnClose() | OnRename() )은 JMP 12, 13,14에서 사용할 수 있습니다.
아래는 테이블 구독을 탐색하는 스크립트입니다. show ctbls 대신 각 변경 사항에 대한 목록을 업데이트할 수 있습니다.
마지막으로 NTTable()은 보이지 않는 데이터 테이블을 "계산"하지만 개인 데이터 테이블은 계산하지 않습니다.
Names Default To Here( 1 );
//---Use one of these functions
//---- JMP 14 function
//ctbls = Get Window List( Type("DataTables")) << Get Window Title();
// --- User function to returns a list of table names
curtbl_fn = Function({}, {nt, tlist={}, i},
nt= NTable();
If(nt >0,
For(i=1, i<=nt, i++,
Insert into(tlist, Data Table(i) << get name)
);
); // end if
tlist
); //end Function
//------ functions to handle when a new table is created, whe a table is renamed and when a table is closed.
fnew = Function( {dtab},
Insert Into(ctbls, dtab << Get Name );
show(ctbls, NTable())
);
fnnme = Function( {dtab, b},{i},
show(dtab, b);
i = contains(ctbls, b );
If (i>0, ctbls[i] = dtab << get name);
show(ctbls, NTable())
);
fclose = Function( {dtab}, {i},
i = contains(ctbls, dtab<<GET name="">0, remove from(ctbls, i));
show(ctbls, NTable());
);
Open("$Sample_Data/Variability Data/2 Factors Crossed.jmp");
Open("$Sample_Data/Baseball.jmp");
Open("$Sample_Data/Basketball.jmp");
Open("$Sample_Data/Football.jmp");
Open("$Sample_Data/Fishing.jmp");
Open("$Sample_Data/Pogo Jumps.jmp");
//_____________________________________________________________________
//--- Run to here ------------------------
//use the JMP 14 command or the functions
ctbls =curtbl_fn();
show(ctbls, NTable());
//--- Run to here and check the log------------------------
aSub = Subscribe to Data Table List( , OnOpen( fnew ) );
Subscribe to Data Table List( aSub, OnRename( fnnme ) );
Subscribe to Data Table List( aSub, OnClose( fclose ) );
dt = Open( "$SAMPLE_DATA/Iris.jmp" );
Wait( 2 );
dt << setname( "yyy" );
// two printouts: one for OnOpen() and one for OnRename()
//--- Run to here and check the log------------------------
Close(Data Table("Fishing"), NoSave);
//--- Run to here and check the log------------------------
//Check Table manipulations
Data Table("yyy") << Subset (All Rows, All Columns, Output Table Name ("Iris redux") );
//--- Run to here and check the log------------------------
Unsubscribe to Data Table List(asub, All);
print("should not do anything");
Close(Data Table("Baseball"), NoSave);</GET>
Re: 테이블 목록: 대화식으로 업데이트하고 선택을 느슨하게 하지 않는 방법지금은 다음과 같이 해결했습니다.
선택한 테이블의 이름을 기억하고 Set Items를 사용하여 완전히 다시 작성한 다음 전체 목록을 반복하고 기억된 이름을 새 목록과 비교합니다(순서, 따라서 이제 인덱스가 다를 수 있습니다!). 같은 이름을 누르자 마자 그 인덱스를 기억하고 이 인덱스를 사용하여 seceted를 설정합니다.
코드는 다음과 같습니다.
listofTablesSelect=Function({this},{selectedIndex},
// This function is called when the List Box selection changes
selectedIndex = this << Get Selected;
selectedTableName = selectedIndex[1];
refreshListofTables();
for (i=1, i<=N Items(listofTablesList = this<<GET items=""></GET>refreshListofTables가 세트 항목을 사용하는 경우:
refreshListofTables = Function({},
Show("Trying to refresh list of tables");
openDTs = List();
For( i = 1, i <= N Table(), i++,
Insert Into( openDTs, Data Table( i )<<GET name=""></GET>내가 좋아하지 않는 유일한 것 : 로그 창에 "JSL 재귀 방지"가 표시됩니다. 재귀는 정확히 어디에 있습니까? ~이다
this << Set Selected(recallIndex);
전체를 효과적으로 호출
refreshListofTables
다시, 따라서 재귀로 가는가?
어떤 방법이 있습니까?
탁,
중