如何知道表是否是链接子集?大家好,
我想确定(使用 JSL)当前数据表是否链接到主表。
我尝试了“<< 获取表变量名称”,但没有成功。
您知道我们如何获取这些信息吗?
在此先感谢您的帮助!
Re: 如何知道一个表是否是一个链接子集?再次感谢您的快速答复伊恩!
我将把这两个部分结合起来做一些测试,但我相信它应该可以完成这项工作! 
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: 如何知道一个表是否是一个链接子集?你好伊恩,
谢谢你的代码! 我想我可以使用类似的东西来解决我的问题。 我只需要为汇总表添加一个额外的控件。 也许这样的事情可能会起作用:尝试获取表格的“源”脚本并检查它是否包含“摘要”一词。
我需要做一些测试...
再次感谢你的帮助。
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: 如何知道一个表是否是一个链接子集?感谢克雷格的建议!
我尝试了“获取表变量名称”,但没有尝试“获取表变量”!
我做了一些测试,它似乎工作得很好!
到目前为止,只有一种特殊情况它不起作用。 如果我创建一个链接到原始表的汇总表,则不会创建表变量。
最后一点有什么想法吗?
Re: 如何知道一个表是否是一个链接子集?您也许可以使用表变量;它需要一些测试,因为我不确定它是否总是设置(更新:尝试了几种方法来制作一个子集,似乎总是创建表变量):
dt<<GETTABLEVARIABLE></GETTABLEVARIABLE>
This 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");