テーブルがリンクされたサブセットかどうかを知る方法は?皆さん、こんにちは。
現在のデータ テーブルがメイン テーブルにリンクされているかどうかを (JSL を使用して) 判断したいと思います。
「<< テーブル変数名の取得」を試しましたが、うまくいきませんでした。
どうすればこの情報を入手できるか分かりますか?
よろしくお願いします。
Re: テーブルがリンクされたサブセットかどうかを知る方法は?Ian さん、非常に迅速な回答をありがとうございました。
2 つの部分を組み合わせていくつかのテストを行うつもりですが、うまくいくはずです! 
Re: テーブルがリンクされたサブセットかどうかを知る方法は?未テスト (いつものように. . 
NamesDefaultToHere(1);
ClearLog();
// See if a table is a summary of another table
isSummary =
Function({dt}, {Default Local},
ts = dt << Get Table Script Names;
if (Contains(ts, "Source"),
ss = dt << getProperty("Source");
if (Head(Arg(ss, 2)) == Expr(Summary), 1, 0),
0
);
);
// Make a summary table
dt1 = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt2 = dt1 << Summary(Mean( :height ));
Print(isSummary(dt1));
Print(isSummary(dt2));Re: テーブルがリンクされたサブセットかどうかを知る方法は?こんにちはイアン、
コードありがとうございます! そのようなものを使用して問題を解決できると思います。 要約テーブルのコントロールを追加するだけです。 テーブルの "Source" スクリプトを取得して、"summary" という単語が含まれているかどうかを確認しようとすると、うまくいくかもしれません。
私はいくつかのテストを行う必要があります...
ご協力いただきありがとうございます。
Re: テーブルがリンクされたサブセットかどうかを知る方法は?これをテストできます(前述の行に沿って):
NamesDefaultToHere(1);
// Function to determine if two tables are linked
rLinked = Function({dt1, dt2}, {Default Local},
dt1 << selectAllRows;
if(NRow(dt2 << getSelectedRows) > 0, linked = 1, linked = 0);
dt1 << clearSelect;
dt2 << clearSelect;
linked;
);
// Look at the open tables in the session and see which pairs are linked
linkedTables = Function({}, {Default Local},
nt = NTable();
linkMat = J(nt, nt, .);
tblNames = {};
for(t1=1, t1<=nt, t1++,
InsertInto(tblNames, DataTable(t1) << getName);
for(t2=t1+1, t2<=nt, t2++,
if(rLinked(DataTable(t1), DataTable(t2)), linkMat[t1, t2] = 1, linkMat[t1, t2] = 0);
);
);
EvalList({linkMat, tblNames});
);
// Make some active tables
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
// Unlinked subset
dt << selectRandomly(0.1);
dt2 = dt << Subset(LinkToOriginalDataTable( 0 ) );
dt2 << setName("Unlinked");
// Linked subset
dt << selectRandomly(0.1);
dt3 = dt << Subset(LinkToOriginalDataTable( 1 ) );
dt3 << setName("Linked");
// Get the 'link matrix'
linkedOrNot = linkedTables();
dt4 = AsTable(linkedOrNot[1], << setName("Linked Tables"), << columnNames(linkedOrNot[2]));
dt4 << NewColumn("Column", Character, Values(linkedOrNot[2]));
dt4 << moveSelectedColumns({"Column"}, ToFirst);
Re: テーブルがリンクされたサブセットかどうかを知る方法は?イアンさん、追加情報ありがとうございます。
あなたは完全に正しいです。「正しい」動作は状況によって異なります。 どちらかが優れていると言っているのではなく、スクリプトで問題が発生することがある理由を説明しようとしているだけです。
また、リンクされたサブセットを作成することが、特定の行に集中するための最良の方法であるとは限らないことにも同意します。 ただし、私のスクリプトは他の人が使用できるため、他の人が以前に何をしたか、どのようなテーブルで作業しているかを制御できません。 したがって、テーブルがリンクされているかどうかを検出する方法を見つけるだけです (つまり、私のスクリプトと互換性がありません)。 その場合、警告を表示してスクリプトを停止できます。
それが実現できない場合は、この特定のケースに対処する別の方法を見つけることができるかもしれません。
Re: テーブルがリンクされたサブセットかどうかを知る方法は?この場合の「正しい」動作は解釈の余地があると思いますが、望ましくないと思われるものを見つけた場合は、support@jmp.com に電子メールを送ってください。
ただし、この場合、リンクされたサブセット テーブルを使用して分析のために特定の行を「分離」する場合は、より従来のアプローチとして、データフィルター、またはそのローカルバージョン。 データの一部のみを使用して生成された数式を保存する場合は、これらを整理するために追加のコードが必要になる場合があります。
Re: テーブルがリンクされたサブセットかどうかを知る方法は?実際、テーブルにリンクされたサブセットで作業し、モデルの適合残差を保存すると、それらは最初のメイン テーブルに保存されます。 ただし、予測式は両方のテーブルに保存されていることに注意してください。 それはかなり奇妙です...
NamesDefaultToHere(1);
// Open a table
dt1 = Open("$SAMPLE_DATA/Big Class.jmp");
// Create a subset
dt2=dt1 << Subset(
Selected Rows( 0 ),
Rows( [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] ),
Selected columns only( 0 ),
link to original data table(1)
);
// Direct the analysis to the subset table
fml = dt2 << Fit Model(
Y( :height ),
Effects( :weight )
);
fm = fml << Run;
// Prediction formula are saved in both dt1 and dt2 and residulas are saved only in dt1
fm << prediction formula;
fm << residuals;この例では、残差と予測式を dt2 のみに含めたいと考えています。
Re: テーブルがリンクされたサブセットかどうかを知る方法は?それにかんする "特に、モデルの適合プラットフォームからの残差とその他の列を現在のデータ テーブルに保存します。 「それなら、私が誤解しているかもしれません。 ただし、常に「モデルの適合」予測を取得して正しいテーブルに移動できるはずです。
NamesDefaultToHere(1);
// Open a table
dt1 = Open("$SAMPLE_DATA/Big Class.jmp");
// Open another table
dt2 = Open("$SAMPLE_DATA/Bands Data.jmp");
// Direct the analysis to the first table
fml = dt1 << Fit Model(
Y( :height ),
Effects( :weight )
);
fm = fml << Run;
// Prediction formula goes to the first, not the current table
Print(CurrentDataTable());
fm << predictionFormula;
Re: テーブルがリンクされたサブセットかどうかを知る方法は?実際、私はいくつかの分析を実行するスクリプトを使用しています。 特に、「モデルのあてはめ」プラットフォームからの残差とその他の列を現在のデータ テーブルに保存します。 このテーブルが別のテーブルにリンクされている場合、列は現在のテーブルではなく元のテーブルに保存され、スクリプトが失敗します。
したがって、ユーザーがスクリプトを起動すると、現在のテーブルが別のテーブルにリンクされていないかどうかを最初に確認したいと思います。 そして、ユーザーが以前に何をしたかを認識していないため、何が何にリンクされているのかを知ることができないのはそのためです.
さらに説明が必要な場合や、不明な点がある場合はお知らせください。
Ian の最後の投稿に答える以外に、このリンク マトリックスを作成する方法はわかりましたが、要約テーブルがある場合、前のスクリプトが機能するかどうかはわかりません。 元のテーブルで行を選択したときに間違っていなければ、集計テーブルでは何も選択されていません。
残念ながら、このケースはまだ問題があります。
Re: テーブルがリンクされたサブセットかどうかを知る方法は?それでは、イアンの答えに行きます。
リンクされたテーブル情報が必要な理由 別のアプローチがあるかもしれません。
Re: テーブルがリンクされたサブセットかどうかを知る方法は?はい、「要約表」のシナリオは私が試したものです - したがって、上記の回答です。 しかし、JMP セッションがどのようにすれば、何が何にリンクされているのかわからない状態になる可能性があることについて、私はまだ頭を悩ませています。 しかし、それは問題ありません。
「NTable()」と私が上で示したものを使用して、「リンクマトリックス」を簡単に作成できます。
Re: テーブルがリンクされたサブセットかどうかを知る方法は?提案してくれてありがとうクレイジ!
「テーブル変数名の取得」を試しましたが、「テーブル変数の取得」は試しませんでした!
私はいくつかのテストを行いましたが、かなりうまくいくようです!
これまでのところ、それが機能しない特定のケースが 1 つだけあります。 元のテーブルにリンクされた集計テーブルを作成すると、テーブル変数が作成されません。
この最後の点について何か考えはありますか?
Re: テーブルがリンクされたサブセットかどうかを知る方法は?テーブル変数を使用できる場合があります。常に設定されているかどうかわからないため、いくつかのテストが必要になります(更新:サブセットを作成するいくつかの方法を試しましたが、テーブル変数は常に作成されているようです):
dt<<GETTABLEVARIABLE></GETTABLEVARIABLE>
This linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableThis linked subset has a table variableこのリンクされたサブセットにはテーブル変数があります
Re: テーブルがリンクされたサブセットかどうかを知る方法は?ありがとう、イアン、それは確かに問題を解決するための非常に便利な方法です!
もう一歩先に進むしかない。 潜在的なメイン テーブル (コード内の dt) がわからない場合、どうすればよいでしょうか?
開いているすべてのテーブルをテストする必要がありますか、それともより速い解決策がありますか?
Re: テーブルがリンクされたサブセットかどうかを知る方法は?いいえ、わかりましたが、「問題」を回避できることをほのめかしていました。 しかし、遡及的に伝えたい場合は、次のようにすることができます。
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
// Unlinked subset
dt << selectRandomly(0.1);
dt2 = dt << Subset(LinkToOriginalDataTable( 0 ) );
dt2 << setName("Unlinked");
// Linked subset
dt << selectRandomly(0.1);
dt3 = dt << Subset(LinkToOriginalDataTable( 1 ) );
dt3 << setName("Linked");
// Function to determine if two tables are linked
rLinked = Function({dt1, dt2}, {Default Local},
dt1 << selectAllRows;
if(NRow(dt2 << getSelectedRows) > 0,
linked = 1,
linked = 0
);
dt1 << clearSelect;
linked;
);
Print(rLinked(dt, dt2), rLinked(dt, dt3));Re: テーブルがリンクされたサブセットかどうかを知る方法は?ご回答ありがとうございます。
ただし、私の目的は、リンクされたサブセットを作成することではなく、既存のテーブルが別のテーブルにリンクされているかどうかを判断することです。
わかりにくかったらごめんなさい!
Re: テーブルがリンクされたサブセットかどうかを知る方法は?FWIW、コードがテーブルを作成すると仮定すると、必要に応じてリンクされたサブセットまたはリンクされていないサブセットを作成できます。
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
// Unlinked subset
dt << selectRandomly(0.1);
dt2 = dt << Subset(LinkToOriginalDataTable( 0 ) );
dt2 << setName("Unlinked");
// Linked subset
dt << selectRandomly(0.1);
dt3 = dt << Subset(LinkToOriginalDataTable( 1 ) );
dt3 << setName("Linked");Re: テーブルがリンクされたサブセットであるかどうかを確認する方法テーブルがリンクされているかどうかを確認するために、ユーザーが決定ツリーを設定する必要があるのは奇妙です。
Jmp はどのテーブルがリンクされているかを認識していると想定します。
では、なぜそのような情報は JSL 経由でアクセスできないのでしょうか?
そうですか?
編集: JMP18 の機能を提供していただきありがとうございます:)
(以下を参照してください)
Re: テーブルがリンクされたサブセットかどうかを知る方法は?リンクされたサブセットであるかどうかについてテーブルを照会する JSL クエリは、以前は存在しませんでした。 しかし、この対話は JMP Development の注目を集め、JMP の次のメジャー リリース (JMP 18) で JSL メッセージが追加されました。
dt << リンクされたサブセットです。 // 1 または 0 を返します
Re: テーブルがリンクされたサブセットかどうかを知る方法は?@ほぎ- それは別の要求です。
私の理解では、リンケージはテーブル作成時に作成されます (または作成されません)。 その方はまだ調査中です。
Re: テーブルがリンクされたサブセットかどうかを知る方法は?リンクを切断するとは、サブセット テーブルが共有している行をメイン テーブルから複製することを意味します。 dtA のリンクを解除する要求は、次のようにプロトタイプ化できます。
- tables->subset を使用して、dtA の完全なコピーを dtB に作成します
- 閉じる
- dtB の名前を dtA の名前に変更します
dtA で開いているすべてのプラットフォームがデータへの接続を失うため、これは不完全です。 かなり少数のユースケースの場合、かなりの量の C++ コードになる可能性があります。@anne_sa利益をもたらす可能性のある使用例を説明します。 しかし、それは別のワームを開くようです: add-in_2 がリンクを解除したため、add-in_1 のリンクされたテーブルが突然リンクされなくなりました。 クローンが必要かどうかを判断するためにリンクの状態を尋ねることができるのは、ここでのスイート スポットかもしれないと思う傾向があります。
Re: テーブルがリンクされたサブセットかどうかを確認するにはどうすればよいですか?素晴らしい :)
リンクをカットする機能を追加してもらえますか?
リンクテーブルとメインテーブル間の接続を切断する機能
Re: テーブルがリンクされたサブセットかどうかを確認するにはどうすればよいですか?オプションを使用してテーブルを連結しようとすると最初のテーブルに追加します。
スクリプトは次のメッセージで停止します。
Cannot append to table: Big Class. Possible reasons for this include: the table is locked, the table is in a platform with a by group, or there is a linked subset of the table. in access or evaluation of 'Concatenate' , Concatenate(/*###*/Data Table( "Subset of Big Class" ), Append to first table)
エラー メッセージは、問題を特定するのに非常に役立ちました。
しかし、リンクされたサブセットに対してスクリプトを堅牢にするにはどうすればよいでしょうか?
追加機能:
dt << リンクされたサブセットのリストを取得()
役立ちます。 その後、JSL 経由でサブセットを閉じることができます。
代替案:
- Jmp はリンクされたデータテーブルを更新します
- Jmpはリンクを自動的にカットします
- concatenate 新しいオプションを取得します: Jmp_is_allowed_to_close_linked_data_tables_if_this_is_needed_to_run_this_concatenate(1)
Re: テーブルがリンクされたサブセットであるかどうかを確認する方法データが並べ替えられたり追加されたりするときに、リンクされたサブセットとレポートをすべて「有効」な状態に保つのは簡単ではありません。
最も簡単な解決策: リンクされたサブセットまたはレポートが開いているときに、ユーザーがテーブルを並べ替えたり、行を追加したり、テーブルを連結したりできないようにします。*)
ユーザーの視点から:
JMP の将来のバージョンで最適化されることを期待しています。
スクリプトがクラッシュしたり、次のようなエラーメッセージが表示されたりしましたか?

...では投票してください:
データテーブルを並べ替え + 行を追加 + 連結 -> 可能にする
*)
インクを塗ったサブセット:
並べ替え → いいえ
行を追加 → いいえ
連結 → いいえ
オープンレポート付き:
運→無し
行を追加 → はい (!)
連結 → はい (!)
リンクされた要約テーブル付き:
sort → no [SORT はなぜ「リンクを切断」しないのか?!?]
行を追加する → はい²
連結する → はい²
² JMP は自動的にリンクを切断します:
