連接和抑制公式伙計們,
我有幾個表(示例),其中包含許多活動列公式。 我的腳本在某一時刻連接了所有表格。 但是,我希望抑制公式,因為我想保持單個表數據(示例)不變,以便比較/覆蓋所有連接的數據。 不幸的是,我似乎無法在連接時正確關閉公式,並且正在評估新連接的列,這會丟失單個示例數據。 我以為我已經通過附加代碼完成了這個節拍,但是當我將初始表重新復製到另一個文件夾時,公式“重新激活”導致了一些挫敗感。 如果有好的解決方案,我願意接受任何意見,因為抑制公式評估在當前實施中不起作用。
尼爾
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;