テーブルのリスト:選択を失わないようにインタラクティブに更新する方法私はこのトピックに関する議論を見てきましたが、解決策を見つけることができませんでした。
問題は次のとおりです。
リストボックスに表示されているテーブルのリストを使用しています。 すべてのテーブルの名前のリストを取得するためにNTable()の方法を使用します。
私が欲しいのは、そのリスト内の行をクリックして選択すると、リスト自体が更新され、新しく開かれたテーブルがあるか、またはいくつかのテーブルが閉じられたかどうかを確認することです。
そのための良い方法は、クリックして選択するたびにSet Items(openDTs)を使用することです。 それはテーブルのリストをうまく更新します-問題はそれが選択を落とすことです。
リストボックスでAppend(openDTs)を使用すると、開いた新しいテーブルはすべて追加されますが、テーブルを閉じても、閉じたテーブルは削除されません。
選択が維持されるように、リストをクリックすると開いたテーブルと閉じたテーブルを反映して、テーブルのリストを更新する最もエレガントで正しい方法は何ですか?
Re:テーブルのリスト:選択を失うことなくインタラクティブに更新する方法ミゲロ、
Kevin Andersonは、このリンクのディスカッションで、私たちの本の第2版であるJSLCompanionのスクリプトを投稿しました。
リストを比較しますが、部分的な文字列を使用します
したがって、リストボックスで選択したアイテムのリストを返す最初の関数を変更することをお勧めします。 次に、Lfunc()関数をcontainsで使用するか、選択したリストと現在のテーブルのリストであるctblsとの共通部分を見つける交差関数を使用します。 結果のリストは、選択する必要のあるリストになります。 このリンクでは、連想配列を使用して交差点を見つけるか、第5章の添付スクリプトを参照する簡単な手法について説明しています。関数uniq_intersect(ctbls、sellist) 。
それがはっきりしていることを願っています。 あなたの他の機能がとても近かったので、私は昨日これ以上追加しませんでした。
Re:テーブルのリスト:選択を失うことなくインタラクティブに更新する方法ありがとう、ジョージア!
これは間違いなく、テーブルの最新リストを作成するためのよりエレガントな方法です。 唯一の小さな質問は、選択を失うことなく選択されたアイテムでリストボックスを更新するための最良の方法は何ですか?
Re:テーブルのリスト:選択を失うことなくインタラクティブに更新する方法ミゲロ、
JMP 14を使用している場合は、開いているデータテーブルのリストを返す新しいコマンドGet Data Table List()があります。 JMP 14を使用していない場合は、N Table()コマンドが必要です。
また、データテーブルリストのサブスクライブ(、OnOpen()| OnClose()| OnRename())は、JMP 12、13、14で使用できます。
以下は、テーブルサブスクリプションを調査するためのスクリプトです。 show ctblsの代わりに、変更のたびにリストを更新できることに注意してください。
最後に、NTable()は非表示のデータテーブルを「カウント」しますが、プライベートデータテーブルはカウントされません。
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:テーブルのリスト:選択を失うことなくインタラクティブに更新する方法今のところ私はそれをこのように解決しました:
選択したテーブルの名前を覚えてから、[アイテムの設定]を使用して完全に書き直し、リスト全体を繰り返して、覚えている名前を新しいリストと比較します(順序が異なるため、現在は順序が異なる場合があります)。 同じ名前を打つとすぐに、そのインデックスを覚えており、このインデックスを使用して設定されています。
コードは次のとおりです。
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がSetItemsを使用する場合:
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
再び、したがって、復活に入るのですか?
それを回避する方法はありますか?
タクンズ、
M