如何知道一个表是否是链接子集?大家好,
我想确定(使用 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 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 不“切断链接”?!?]
添加行→是²
连接 → 是²
² JMP自动切断链接:
