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