為什麼選擇/取消選擇行會觸發重新計算列公式?我有一個大約有 100,000 行和 2000 列的資料表。其中數十列包含公式。當我在某處進行更改時,我注意到狀態列顯示“正在評估 ##column_xyz”,並且它會繼續評估資料表中的每個公式。由於這是一個相當大的表並且有很多公式,因此計算所有公式最多需要 60 秒。因此,我對執行觸發公式計算的操作非常敏感,因為使用者介面將變得無響應,直到完成為止,並且當它意外發生時,這可能會非常煩人。另一方面,我不想一直“抑制公式評估”,因為有時我會忘記它,並且數據不會在應該更新的時候更新。
因此,在這個大型資料表上,我有一個 JSL 腳本,它使用 Graph Builder 平台產生一組圖表,應用一些本地資料過濾器,對資料執行一些選擇性突出顯示。本質上,該腳本的目的是動態生成圖表並準備將其剪下並貼上到電子郵件或報告中。
我注意到這個腳本似乎需要很長時間才能運行。比應有的時間要長。在圖表最終出現之前,UI 有近 60 秒的時間沒有回應。我花了一些時間試圖弄清楚這 60 秒內發生了什麼。然後我突然意識到這個腳本以某種方式觸發了公式評估。這並不是很明顯,因為資料表狀態列沒有顯示正常的「正在評估...」訊息;它保持空白,大概是因為評估是由腳本而不是使用者操作觸發的。當我在「腳本日誌」視窗開啟時執行腳本時,日誌狀態列顯示「正在評估 ##column_with_formula」。日誌狀態列被凍結在該訊息上,儘管延遲的持續時間讓我相信它實際上正在評估表中的每個公式列。然後我通過為整個表啟用“抑制公式評估”並再次運行腳本來確認公式評估是罪魁禍首 - 圖表幾乎立即出現。
透過反覆試驗,我將其範圍縮小到腳本中的一行 - “選擇位置”用於突出顯示生成的圖表上的一些數據。它看起來像這樣:
myDT << Select Where( :Name("##column_with_formula") == "value" );我覺得很奇怪;也許它與“哪裡”部分有關。所以我用更簡單的東西替換了這一行:
myDT << Select Rows( {1,3,5,7} );甚至這句台詞似乎仍然在幕後觸發公式評估。然後我又做了一些實驗:
- 打開任務管理器後,我以正常方式觸發公式評估(更改列中的值)。狀態列顯示正在評估的公式,我的 CPU 使用率立即飆升至 30%(一個 CPU 核心最大化)。
- 我等待活動停止,然後嘗試使用 UI 在資料表上選擇一行。狀態列沒有變化;它仍然顯示“已完成評估”。但任務管理器顯示的 CPU 活動與正在發生公式計算時完全相同。
- 我為數據表啟用了“抑制公式評估”,並在數據表上選擇了不同的行。CPU 使用率並沒有飆升。
總而言之,透過實驗我證明了以下內容:
- JMP 多餘地執行列公式評估;與使用者介面的基本互動會導致計算在後台進行,即使實際上沒有修改任何輸入資料。
- JMP 對於何時執行這些公式評估並不透明。狀態列有時會顯示一則訊息,但大多數時候沒有任何跡象表明這種情況正在發生。這通常表現為使用者介面無明顯原因的滯後/卡頓/無回應。
- 似乎如果觸發一列進行評估,則所有列都會被評估,無論它們是否需要它。
對於較小的資料集和較少且不太複雜的公式,過多的公式評估似乎不是問題。但如果公式夠複雜,資料集很大,這確實會成為一個障礙。就我而言,我想我將不得不適應始終抑制公式評估並且僅手動評估公式。但這很容易出錯,就像在 Excel 中將工作簿重新計算設定為手動一樣。至少 Excel 有一個依賴樹,允許它僅評估已更改資料的必要公式,並且如果使用者適當地設計公式,則可以始終以最小的開銷將計算保留在自動狀態。誠然,我對 JMP 的熟悉程度不如對 Excel 的熟悉程度,因此在 JMP 中可能有一些我還沒有學會的處理此問題的方法。
有人對如何管理大量複雜公式而不一直抑制 eval 有什麼建議嗎?
另外,正如我的文章標題中所述,我有興趣知道為什麼行選擇觸發公式 eval 會發生變化。另外,為什麼 JMP 有時會告訴您它正在計算公式,有時會隱藏它?
回覆:為什麼選擇/取消選擇行會觸發重新計算列公式?好吧,很高興終於聽到我不是唯一一個為此苦苦掙扎的人。差不多四年過去了,這種情況仍然沒有得到任何改善。有各種奇怪的情況會觸發整個資料表上的公式求值,即使公式求值據說在表範圍內被抑制。抑制單一欄位上的公式 eval 是行不通的,因為無法處理依賴關係。必須取消抑制所有列,JMP 才能以正確的順序評估它們。此外,在 JMP16 中,公式評估引擎甚至似乎變得更慢。現在評估我的整張桌子需要花費不合理的時間。
在此基礎上,再加上這些論壇中不斷提出的刪除所有公式並僅儲存固定值的建議,我得出的結論是,JMP 根本不適合處理動態公式,而只能處理靜態資料。公式一開始很好,當你的表很小並且它們仍然可以正常工作時,但是當公式計數、公式複雜性或行數超過一定限制時,你就會碰壁。我將不得不使用其他一些工具完全重新設計該項目,並僅使用 JMP 進行繪圖/演示/統計。
我將把這個問題標記為已解決。解決辦法就是沒有辦法。如果您遇到此問題,那麼 JMP 不是適合該工作的工具。刪除動態公式並僅儲存靜態資料。
回覆:為什麼選擇/取消選擇行會觸發重新計算列公式?我對大型數據表也有類似的問題。
一次又一次地觸發公式評估。
儲存表格並重新開啟後,一切正常。
因此,重新評估可能是由變數名稱衝突觸發的。 U重置變數名稱後問題就消失了。
如果其他用戶也有類似的問題,這裡希望快速啟用和停用單一公式:
啟用/停用公式計算的快速方法
另一個想法:預設禁用公式評估 - 獲得平滑的 Jmp,而無需此類虛假的公式重新評估。
如果在數據表中添加一些數據,只需觸發一次性公式評估。 這是願望:
觸發特定公式的一次性公式評估的快速方法
回覆:為什麼選擇/取消選擇行會觸發重新評估列公式?該表不是在舊版的 JMP 中建立的。它可能已經有一年了,所以它是 JMP 13 或 14。
我使用紅色小三角選單檢查表的抑制評估框,然後儲存並關閉它。重新開啟表後,不再選取抑制評估框,因此表範圍的設定顯然沒有透過儲存表來保留。當表格開啟時,狀態列立即顯示「正在評估 xyz...」。我不確定是什麼觸發了這種情況的發生。
我有一個 OnOpen 腳本,用於將資料填入某些資料查找函數中使用的某些關聯數組。我將 OnOpen 重命名為其他名稱以停用它,這樣當我打開表時它就不會觸發,但評估仍然會發生。
我編寫了一個 JSL 腳本來進入大多數公式列的列屬性並在那裡抑制 eval,因為我知道保存表時會保留此選項。 所以現在全表評估幾乎不需要那麼長時間。我想這就是我從現在開始處理它的方式:抑制單一列上的 eval,當我匯入需要運行公式的新資料時,使用腳本暫時取消抑制它們。
回覆:為什麼選擇/取消選擇行會觸發重新評估列公式?我無法製作一個在打開時具有計算公式的表格。@中偉
此首選項可能會對在 JMP 5 左右建立的 JMP 表產生影響。我目前看不到它有任何作用。
可以使用資料表的紅色小三角選項來抑制公式求值並將表保存在該狀態(包含部分求值的欄位)。 您可以使用同一紅色三角形中的 rerunFormulas 來強制更新(或來自 JSL)。 (這可能就是您所要求的。)
省長說的原因不建議當表格設定了抑制位元時,它會變得非常混亂嗎?或者它曾經這樣做過。
如果您尋求技術支持,他們將輸入並追蹤缺陷(或找出為什麼存在該首選項以及它對舊格式表做了什麼。)
沒有調試/日誌記錄框架。
回覆:為什麼選擇/取消選擇行會觸發重新計算列公式?Craige,在計算公式時寫入日誌是個好主意。我將使用此技術來進一步解決專案中與公式計算相關的 UI 延遲和延遲問題。我的方法沒有那麼精確。但我確實有一個問題 - JMP 中是否有我可以打開的“調試”模式或“詳細日誌記錄”功能?如果我不必在程式碼中放入如此多的 Write 語句只是為了弄清楚 JMP 在任何給定時刻正在做什麼,那就太好了。
然而,目前我仍然需要按原樣使用這個專案來完成我目前的工作。我只想完全抑制公式計算並根據需要手動重新運行公式。即使我在首選項選單中啟用了“禁止開啟時求值”,JMP 仍會在我開啟表格時立即求值公式。有沒有辦法完全阻止該表上的所有自動公式評估?如果此首選項應該執行此操作但它不起作用,有什麼方法可以提交錯誤報告?
僅供參考,我在 Windows 10 x64 上使用 JMP PRO 14.1。
回覆:為什麼選擇/取消選擇行會觸發重新評估列公式?您運行的是哪個版本的 JMP?
據我所知,14 正在做我所期望的事情;這是我的測試 JSL
New Table( "Untitled", add rows(3),
// EVERYTHINGCOL depends on everything. it evaluates last.
New Column( "EVERYTHINGCOL", Formula( Write( "\!nEVERYTHINGCOL,row" || Char( Row() ) ); :ROWSTATECOL + :INDEPCOL + :DEPONINDEP; ) ),
// DEPONINDEP depends on INDEPCOL, but not ROWSTATECOL.
New Column( "DEPONINDEP", Formula( Write( "\!nDEPONINDEP,row" || Char( Row() ) ); :INDEPCOL + 1; ) ),
// INDEPCOL is independent. It evaluates early, maybe first.
New Column( "INDEPCOL", Formula( Write( "\!nINDEPCOL,row" || Char( Row() ) ); 17; ) ),
// ROWSTATECOL is directly dependent on row state information. It evaluates early, maybe first.
New Column( "ROWSTATECOL", Formula( Write( "\!nROWSTATECOL,row" || Char( Row() ) ); Selected( Row State() ); ) ),
)
查看日誌;各專欄在評估時進行報告。 選擇行會導致其中兩列進行計算,但另外兩列不會進行計算。
回覆:為什麼選擇/取消選擇行會觸發重新計算列公式?在「表格」下的「首選項」選單中,有一個「開啟時禁止公式評估(不建議)」的選項。我打開了這個選項,但它似乎不起作用。當我打開資料表時,它開始時公式 eval 未被抑制,我仍然需要手動抑制。這個選項是否損壞或我誤解了它應該做什麼?
回覆:為什麼選擇/取消選擇行會觸發重新計算列公式?Craige,我的觀點是所有公式都會重新計算它們是否依賴行狀態。絕大多數公式與行狀態沒有任何關係,但行狀態的變更無論如何都會導致它們重新計算。我想 JMP 會一直計算一切,如果發生任何可能影響可能存在的任何類型公式的事情。在我看來,這是不必要且低效的。就像當手術刀就足夠時卻使用戰斧一樣。我相信用這種方式寫程式會更容易;這似乎是一種簡單的方法,當我得知這就是 JMP 處理公式評估的方式時,我感到很驚訝。
現在我更了解了公式的計算方式,我當然可以透過抑制公式 eval 並插入 dt << runFormulas; 來解決它。等待(0);在我的腳本中聲明。它不會很漂亮,但我想它會起作用。
回覆:為什麼選擇/取消選擇行會觸發重新計算列公式?是的,如果任何公式依賴行狀態信息,則更改行選擇將重新評估該列以及依賴它的任何列。
在行狀態變更後使用 dt<回覆:為什麼選擇/取消選擇行會觸發重新計算列公式?
吉姆,謝謝你的回覆。表格包含時間序列數據,我定期匯入最新數據。我想保留公式,以便在將新資料新增至表後計算它們。
對於大多數這些公式,該值僅取決於同一行中的其他資料。排除表中前面的資料不會對下面的值產生任何影響,因此無需重新計算整個列,但無論如何都會發生。如果只有當公式包含 Col Maximum() 或 Lag() 或其他此類函數(會導致公式受到其他行中的值的影響)時才會發生這種情況,那就太好了。
此外,對我來說最令人驚訝的部分是,僅僅選擇行觸發了全表重新評估(CPU 使用率和 UI 響應能力證明了這一點)。如果公式可能會受到排除行的影響,為什麼不在使用者實際使用時觸發計算排除一行?我想理論上使用者可以編寫一個取決於當前行選擇狀態的列公式,但這對我來說似乎是一種罕見的邊緣情況。
回覆:為什麼選擇/取消選擇行會觸發重新評估列公式?重新計算已完成,因為公式可能會受到給定列的儲存格選擇/排除變更的影響。考慮到資料表的大小,我會考慮更改公式值不會更改的任何列,然後刪除「公式」屬性,將它們變成典型的數字列。
回覆:為什麼選擇/取消選擇行會觸發重新評估列公式?@克里斯_羅德里格斯寫道:
此外,對我來說最令人驚訝的部分是,僅僅選擇一行觸發了全表重新評估(CPU 使用率和 UI 響應能力證明了這一點)。如果公式可能會受到排除行的影響,為什麼不在使用者實際使用時觸發計算排除一行?我想理論上使用者可以編寫一個取決於當前行選擇狀態的列公式,但這對我來說似乎是一種罕見的邊緣情況。
這也讓我很困惑。 為什麼 Jmp 不區分行狀態:排除和已選擇?
即使行狀態已更改 - 可能會進行後續檢查以查看是否排除()狀態發生了變化。
我同意@克里斯_羅德里格斯- 大多數列公式都會使用排除()並不是已選擇() 。
[但是,那些具有已選擇()是最酷的:)]
聽起來不像是小眾問題。 對於5-1000行資料的樣本資料來說,這並不是什麼大問題。
但對於較大的資料集,使用者使用排除()在列公式中要付出巨大的懲罰!
Names Default To Here( 1 );
dt = New Table( "test",
add rows( 5 ),
New Column( "excluded",
Formula(
Print( As Date( today() ) );
Excluded();
)
)
);
回覆:為什麼選擇/取消選擇行會觸發重新計算列公式?感謝 Jmp 開發團隊在 Jmp 18 中修復了此問題:)
https://community.jmp.com/t5/JMP-Wish-List/column-group-deactivate-formula-eval/idc-p/701864/highlight/true#M5070