连接和抑制公式伙计们,
我有几个表(示例),其中包含许多活动列公式。 我的脚本在某一时刻连接了所有表格。 但是,我希望抑制公式,因为我想保持单个表数据(示例)不变,以便比较/覆盖所有连接的数据。 不幸的是,我似乎无法在连接时正确关闭公式,并且正在评估新连接的列,这会丢失单个示例数据。 我以为我已经通过附加代码完成了这个节拍,但是当我将初始表重新复制到另一个文件夹时,公式“重新激活”导致了一些挫败感。 如果有好的解决方案,我愿意接受任何意见,因为抑制公式评估在当前实施中不起作用。
尼尔
Con = Expr(
n = N Table();
dt = {};
// Sort list ascending (sample replicates)
For( i = 1, i <= n, i++,
table = data table(i);
insert into(dt, table);
sort list into(dt)
);
// Concatenate each file (sample replicates)
dt_all = Data Table( dt[1] );
For(i = 1, i <= n, i++,
If(i > 1,
Suppress Formula Eval(suppress=1);
dt_all << Concatenate(Invisible, dt[i], Append to first table);
)
);
Current Data Table(dt_all);
);
数据访问质量与工艺工程回复:连接和抑制公式亚诺,
伟大的输入。 事实上,我昨晚开始查看“Is Empty”路线。 因此,为了完成消除公式和连接的讨论,我采纳了你的建议并通过编码你的建议更新了我的技能。 此外,根据我的原始帖子和代码,我进行了同样有效的更新。
- 第一个块使用“为空”语句来挑出 NO 公式列,并只删除其余的公式。
- 第二个块是使用“尝试”,即使在我查看了脚本索引之后,我一开始也没有完全理解你的建议。 我以为执行会像以前的尝试一样停止,但显然不会。
- 第三个块对打开的第一个表使用“抑制公式评估”。 所有其他表都连接到第一个表,这也提供了所需的输出,其中未评估最终连接的表列。
我非常感谢您为帮助我提高技能所做的所有投入。
尼尔
For( i=1, i <= N Items(b), i++,
If(i==1,
file_1 = Open(SD1 || b[1]);
CN = file_1 << get column names(numeric);
For(j=1, j <= N Items(CN), j++,
result = Column(file_1, CN[j]) << Get Formula;
y = Is Empty(result);
If(y==0, Column(file_1, CN[j]) << delete formula);
);
);
If(i > 1,
file_nxt = Open(SD1 || b[i], Private);
file_1 << Concatenate(file_nxt, append to first table);
Close(file_nxt, no save);
);
);
file_1 << Save(SD1 || "All Summary");
Close("All Summary");For( i=1, i <= N Items(b), i++,
If(i==1,
file_1 = Open(SD1 || b[1]);
CN = file_1 << get column names(numeric);
For(j=1, j <= N Items(CN), j++,
Try(Column(file_1, CN[j]) << delete formula);
);
);
If(i > 1,
file_nxt = Open(SD1 || b[i], Private);
file_1 << Concatenate(file_nxt, append to first table);
Close(file_nxt, no save);
);
);
file_1 << Save(SD1 || "All Summary");
Close("All Summary");For( i=1, i <= N Items(b), i++,
If(i==1,
file_1 = Open(SD1 || b[1]);
file_1 << Suppress Formula Eval(1);
);
If(i > 1,
file_nxt = Open(SD1 || b[i], Private);
file_1 << Concatenate(file_nxt, append to first table);
Close(file_nxt, no save);
);
);
file_1 << Save(SD1 || "All Summary");
Close("All Summary");回复:连接和抑制公式如果您不一定需要公式,甚至不需要创建它们,因为您可以使用 << 设置每个值而不是公式(或在创建后立即删除公式)。 但是如果你确实需要它们,你可以检查列是否有一个带有 << get formula 的公式,如果结果是 Empty() 那么公式不存在(使用 IsEmpty() 检查丢失的公式)或者你可以“蛮力" 它与 Try-catch。
获取公式:
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
col = New Column("Ratio");
result = col << Get Formula;
Show(result, IsEmpty(result));
col << Set Formula(:Height / :Weight);
col << Eval Formula;
result = col << Get Formula;
Show(result, IsEmpty(result));
试着抓:
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
col = New Column("Ratio");
Try(col << Delete formula, show(exception_msg)); //the show part isn't necessary
然后,如果您只想在具有公式的列上循环,您可以在列表上循环并构建新的列表(如果您有 JMP16,请使用 Filter Each)。
社区中也有一些关于如何删除表格中所有公式的帖子,例如:查找并删除表中存在的所有公式
回复:连接和抑制公式亚尔莫,
非常感谢您阐明这个问题。 我没有意识到没有现有公式会有问题。 考虑到这一点,我为第一个表创建了一个条件语句。 这显然有效,因为“file_1”删除了一次特定的列公式。 附加代码适用于单列示例。
既然知道需要提供公式,问题是所有列都没有公式。 因此,如果我检索所有列名,将有一个没有关联列的子集。 有没有办法测试列是否有公式,以便可以构建适当的列表来循环? 或者我只是通过在 JSL 中设置一个列表来“暴力破解”这个问题,每次我将公式添加到列时我都必须更新这个列表?
尼尔
For( i=1, i <= N Items(b), i++,
If(i==1,
file_1 = Open(SD1 || b[1]);
file_1:"Pore Diameter (um)" << delete formula;
);
If(i > 1,
file_nxt = Open(SD1 || b[i], Private);
file_1 << Concatenate(file_nxt, append to first table);
Close(file_nxt, no save);
);
);
file_1 << Save(SD1 || "All Summary");
Close("All Summary");
回复:连接和抑制公式您确定要访问正确的数据表吗? 您总是在 for 循环中打开与 file_1 相同的文件。
您可以在 for 循环中添加一些调试打印,以帮助您找出问题所在,例如:
file_1 = Open(SD1 || b[1]);
show(file_1);
show(file_1 << Get Column Names("String")); //depending how many columns you have might not want to do this
show(Contains(file_1 << Get Column Names("String"), "Pore Diameter (um)"));
file_1:"Pore Diameter (um)" << delete formula;还请记住使用 Close(dtref, no save); 关闭不再需要的数据表;
回复:连接和抑制公式这么晚才回复很抱歉。 我感谢所有的反馈。
在不攻击所有列的情况下,我只是尝试消除特定列中的一个公式。 当我在循环外应用“删除公式”行时,我得到了想要的结果,即不存在公式。 但是,如果同一行进入循环,则在打开文件后,会出现以下错误:
“列孔径(um)在'删除公式'的访问或评估中没有公式,删除公式/*###*/”
显然,我还不了解为什么会出现问题。 你能提供一些见解吗?
非常感谢。
For( i=1, i <= N Items(b), i++,
file_1 = Open(SD1 || b[1]);
file_1:"Pore Diameter (um)" << delete formula;
If(i > 1,
file_nxt = Open(SD1 || b[i], Private);
file_1 << Concatenate(file_nxt, Append to first table);
);
);
//file_1:"Pore Diameter (um)" << delete formula;
file_1 << Save(SD1 || "All Summary");
Close("All Summary");回复:连接和抑制公式JMP 还能够通过标准化属性以交互方式执行此操作:
选择所有列,右键单击其中一列并选择标准化属性:

将公式添加到删除属性并按确定(或应用):

如果您有 JMP16,这将打印到增强日志:
// Open Data Table: Wheat.jmp
// → Data Table("Wheat")
Open("$SAMPLE_DATA/Wheat.jmp");
// Standardize column attributes
Local({old dt = Current Data Table()},
Current Data Table(Data Table("Wheat"));
For Each({col, index},
{:Variety, :Yield, :Moisture, :Pred Formula Yield, :Cond Pred Formula Yield},
col << Delete Formula
);
Current Data Table(old dt);
);
这将给出如何处理这个问题的好主意(与 txnelson 所说的一样,遍历列表并删除公式)。 您还可以使用 << 获取列名获取表中的所有列。 您将无法从没有它们的列中删除公式(并且增强日志提供的脚本不会像那样直接工作),但您可以通过使用 Try() 包装 col << Delete 公式来避免这种情况。 清理增强的日志脚本后,您可能会得到如下结果:
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Wheat.jmp");
For Each({col}, dt << get column names(String),
Try(Column(dt, col) << Delete Formula)
);回复:连接和抑制公式您可以将列名放在一个列表中,然后在列表中循环,删除每一个。
回复:连接和抑制公式吉姆,
感谢您的回复。 由于每个表大约有 10 列带有公式,是否有“一揽子”方法一次性全部删除?
尼尔
回复:连接和抑制公式您需要做的是在串联之前删除公式。这会将值转换为静态值,然后您就不会有问题。
:yourColumn << delete formula;