连接和抑制公式各位,
我有几个表(示例),其中包含许多活动列公式。 我的脚本一度连接了所有表格。 但是,我希望抑制公式,因为我希望保持单个表数据(样本)完整,以便比较/覆盖所有连接的数据。 不幸的是,我似乎无法在连接时正确关闭公式,并且正在评估新连接的列,这会丢失单个样本数据。 我以为我有附加代码的节拍,但是当我将初始表重新复制到另一个文件夹时,公式“重新激活”导致了一些挫败感。 如果有一个好的修复,我愿意接受任何输入,因为抑制公式评估在当前实现中不起作用。
尼尔
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);
);
数据表脚本编写回复:连接和抑制公式您需要做的是在连接之前删除公式。这会将值转换为静态值,然后您就不会遇到问题。
:yourColumn << delete formula;
回复:连接和抑制公式吉姆,
感谢您的回复。 由于每个表大约有 10 列带有公式,是否有“一揽子”方法可以一次性删除所有内容?
尼尔
回复:连接和抑制公式您可以将列名放在一个列表中,然后遍历列表,删除每一个。
回复:连接和抑制公式JMP 还可以通过标准化属性以交互方式执行此操作:
选择所有列,右键单击其中一列并选择标准化属性:

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

如果您有 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 所说的一样,循环遍历列表并删除公式)。 您还可以使用 << Get Column Names 获取表中的所有列。 您将无法从没有公式的列中删除公式(增强日志提供的脚本不会直接像那样工作),但您可以通过使用 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)
);回复:连接和抑制公式这么晚才回复很抱歉。 我感谢所有的反馈。
在没有攻击所有列的情况下,我只是尝试在特定列中删除一个公式。 当我在循环外应用“删除公式”行时,我得到了想要的结果,即不存在公式。 但是,如果同一行进入循环,则在打开文件后,我会收到以下错误:
“柱孔径(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");回复:连接和抑制公式您确定要访问正确的数据表吗? 您总是在 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); 关闭不再需要的数据表;
回复:连接和抑制公式亚莫,
非常感谢您阐明问题。 我没有意识到如果没有现有的公式会有问题。 考虑到这一事实,我为第一个表创建了一个条件语句。 这显然有效,因为“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");