如何知道一個表是否是鏈接子集?大家好,
我想確定(使用 JSL)當前數據表是否鏈接到主表。
我嘗試了“<< 獲取表變量名稱”,但它沒有用。
您知道我們如何獲得這些信息嗎?
在此先感謝您的幫助!
回复:如何知道一個表是否是鏈接子集?再次感謝您的快速回答,伊恩!
我要把這兩部分結合起來做一些測試,但我相信它應該能完成工作! 
回复:如何知道一個表是否是鏈接子集?未經測試(像往常一樣...... 
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));回复:如何知道一個表是否是鏈接子集?你好伊恩,
謝謝你的代碼! 我想我可以用類似的東西來解決我的問題。 我只需要為匯總表添加一個額外的控件。 也許類似的方法可行:嘗試獲取表的“源”腳本並檢查它是否包含“摘要”一詞。
我需要做一些測試...
再次感謝您的幫助。
回复:如何知道一個表是否是鏈接子集?您可以對此進行測試(按照我之前提到的方式):
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);
回复:如何知道一個表是否是鏈接子集?感謝您提供更多信息,伊恩。
你是完全正確的,“正確”的行為取決於具體情況。 我並不是說一個比另一個好,而只是想解釋為什麼我的腳本有時會出錯。
我也同意創建鏈接子集可能並不總是專注於某些特定行的最佳方式。 然而,由於我的腳本可以被其他人使用,我無法控制他們之前做了什麼以及他們正在使用什麼樣的表。 所以這個想法只是找到一種方法來檢測表是否是鏈接表(即與我的腳本不兼容)。 在那種情況下,我可以顯示警告並停止腳本。
好吧,如果它不可行,也許我可以找到另一種方法來處理這種特殊情況。
回复:如何知道一個表是否是鏈接子集?我想在這種情況下“正確”的行為是可以解釋的,但是如果您看到您認為不受歡迎的事情,請發送電子郵件至 support@jmp.com。
但是在這種情況下,如果您打算使用鏈接的子集表來“隔離”某些行以進行分析,則更傳統的方法可能是使用數據過濾器,或其本地版本。 如果您要保存僅使用部分數據生成的公式,您可能需要一些額外的代碼來整理這些公式。
回复:如何知道一個表是否是鏈接子集?事實上,如果我使用鏈接到表的子集並保存擬合模型殘差,它們將存儲在第一個主表中。 但是,我剛剛說過預測公式保存在兩個表中! 這很奇怪……
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 中有殘差和預測公式。
回复:如何知道一個表是否是鏈接子集?關於 ”特別是,它在當前數據表中保存來自 Fit Model 平台的殘差和其他列"那麼我可能理解錯了。 但是您應該始終能夠獲得“擬合模型”預測以轉到正確的表格:
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;
回复:如何知道一個表是否是鏈接子集?實際上我正在使用一個運行多個分析的腳本。 特別是,它將“擬合模型”平台中的殘差和其他列保存在當前數據表中。 如果此錶鍊接到另一個表,列將保存在原始表中而不是當前表中,這會使我的腳本失敗。
因此,當用戶啟動腳本時,我想首先檢查當前表是否未鏈接到另一個表。 由於我不知道用戶之前做了什麼,這就是我無法知道什麼可以鏈接到什麼的原因。
讓我知道您是否需要更多解釋或不清楚的地方!
除了回答 Ian 的上一篇文章外,我還看到了我們如何構建這個鏈接矩陣,但如果我們有一個匯總表,我不確定之前的腳本是否有效。 如果您在原始表中選擇行時我沒有錯,則不會在匯總表中選擇任何內容。
所以不幸的是,這種情況仍然存在問題。
回复:如何知道一個表是否是鏈接子集?那麼我會接受伊恩的回答。
為什麼需要鏈接表信息? 也許還有另一種方法。
回复:如何知道一個表是否是鏈接子集?是的,“匯總表”場景是我嘗試過的場景——因此我在上面回復了。 但我仍然在思考您的 JMP 會話如何進入您不知道什麼鏈接到什麼的狀態。 但沒關係。
您可以使用“NTable()”和我上面給出的內容輕鬆構建“鏈接矩陣”。
回复:如何知道一個表是否是鏈接子集?感謝克雷奇的建議!
我嘗試了“獲取表變量名稱”,但沒有嘗試“獲取表變量”!
我做了一些測試,它似乎工作得很好!
到目前為止,只有一種特殊情況不起作用。 如果我創建鏈接到原始表的匯總表,則不會創建表變量。
最後一點有什麼想法嗎?
回复:如何知道一個表是否是鏈接子集?您也許可以使用表變量;它需要一些測試,因為我不確定它是否總是被設置(更新:嘗試了幾種方法來製作一個子集,似乎總是創建表變量):
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 variable這個鏈接的子集有一個表變量
回复:如何知道一個表是否是鏈接子集?謝謝伊恩,這確實是解決問題的一種非常方便的方法!
我只需要更進一步。 如果我們不知道潛在的主表(代碼中的 dt)是什麼,我們怎麼能這樣做呢?
我們必須測試所有打開的表還是有更快的解決方案?
回复:如何知道一個表是否是鏈接子集?不,我明白了,但這是在暗示你可以避免這個“問題”。 但是如果你想回顧一下,你可以這樣做:
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));回复:如何知道一個表是否是鏈接子集?謝謝你的回答伊恩。
但是,我的目標不是創建鏈接子集,而是確定現有表是否鏈接到另一個表。
對不起,如果我不夠清楚!
回复:如何知道一個表是否是鏈接子集?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");回覆:如何知道一個表格是否是連結子集?奇怪的是,使用者必須建立一個決策樹來確定表是否連結。
我假設 Jmp知道連結了哪些表。
那麼,為什麼無法透過 JSL 存取此類資訊?
是嗎?
編輯:感謝您提供 JMP18 的功能:)
(見下文)
回复:如何知道一個表是否是鏈接子集?以前不存在用於查詢表是否為鏈接子集的 JSL 查詢。 但是,此對話引起了 JMP Development 的注意,現在在 JMP 的下一個主要版本(JMP 18)中添加了一條 JSL 消息。
dt << 是鏈接子集; // 將返回 1 或 0
回复:如何知道一個表是否是鏈接子集?@hogi - 現在這是一個不同的要求。
據我了解,鏈接是在創建表時創建(或不創建)的。 那個仍在調查中。
回复:如何知道一個表是否是鏈接子集?切斷鍊接意味著克隆子表從主表共享的行。 取消鏈接 dtA 的請求可以用
- 使用 tables->subset 將 dtA 的完整副本複製到 dtB
- 關閉dtA
- 將 dtB 重命名為 dtA 的名稱
這是不完美的,因為在 dtA 上打開的任何平台都會失去與數據的連接。 對於相當小的用例集,它可能會變成相當多的 C++ 代碼。@anne_sa確實解釋了可能受益的用例。 但這似乎打開了一個不同的蠕蟲病毒:突然 add-in_1 的鏈接表不再鏈接,因為 add-in_2 取消了它的鏈接。 我傾向於認為能夠詢問鏈接狀態以決定是否需要克隆可能是這裡的最佳選擇。
回复:如何知道一個表是否是鏈接子集?精彩的 :)
您會添加一個功能來切斷鍊接嗎?
切斷鍊接表和主表之間的連接的功能
回复:如何知道一個表是否是鏈接子集?如果我嘗試使用選項連接表格附加到第一個表,
腳本停止並顯示以下消息:
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自動切斷鍊接
- 連接得到一個新選項: Jmp_is_allowed_to_close_linked_data_tables_if_this_is_needed_to_run_this_concatenate(1)
回覆:如何知道一個表格是否是連結子集?當資料排序或新增時,保持所有連結的子集和報告「活動」並不容易。
最簡單的解決方案:當連結的子集或報表開啟時,阻止使用者對錶進行排序、新增行或連接表。 *)
從使用者的角度來看:
我希望它可以在JMP的未來版本中優化。
您的腳本是否崩潰了或您是否被錯誤訊息卡住了,例如

……那請投票:
對資料表進行排序+新增行+連接->使其成為可能
*)
帶有墨水子集:
排序 → 否
新增行 → 否
連接→否
並附上一份公開報告:
運氣 → 沒有
新增行 → 是(!)
連接 → 是 (!)
帶有連結的匯總表:
sort → no [為什麼 SORT 不「切斷連結」?
新增行 → 是²
連接 → yes²
² JMP自動切斷連結:
