除非事後運行,否則部分腳本不會執行我有一部分腳本用於對錶中的列進行重新編碼,以將值從“X”更改為 0。 當與我的主腳本分開運行時,我得到了這部分程式碼的工作(謝謝 JMP 討論論壇!!)。 但是,當我將其插入到更大的腳本中時(即使在最後)JMP 不會執行我的命令。 當程式碼被放置在我的腳本中間時,它之後的所有內容都沒有運行......所以我將它移到主腳本的底部,但它仍然沒有執行。 每次我突出顯示這部分並在事後運行它時,它都完全符合我的要求。
我嘗試實作 wait(0);,從 i 改為 k,並在 For Each Row 周圍使用 Try 語句,但沒有成功。 我真的很摸不著頭腦,為什麼它只能在事後才起作用。 建議?
//Recode columns in Yield Table to give "0" instead of X's
wait(0);
yieldcols = Yields << get column names;
For Each Row( For( k = 1, k <= N Items( yieldcols ), k++,
If( Is Missing( As Column( yieldcols[k] )[] ),
As Column( yieldcols[k] )[] = 0 ) ) );
進階統計建模自動化和腳本編寫資料混合與清理實驗設計大規模客製化回覆:除非事後運行,否則部分腳本不會執行你好,
我不確定為什麼我提供的程式碼不適合您。 您可以嘗試以下操作:
1)在新視窗中單獨運行我提供的原始程式碼。 有效嗎? 如果沒有,您使用的是哪個版本的 JMP? 例如,直接資料表索引已在幾個版本之前添加,但在 JMP 12 中並未添加。
2)假設1)上述有效,下一步是將所有“dt”實例替換為“yields”,在新視窗中單獨運行新程式碼。 這對我有用,如果 1) 對你有用,我希望它也對你有用。
Names Default To Here(1);
//create a table with roughly 10% missingness
yields = astable(J(1e5,5,randominteger(1, 20)/(randomuniform() > 0.1)));
For( i = 1, i <= N Col( yields ), i++,
yields[Loc( Is Missing( yields[0, i] ) ), i] = 0
);
3) 如果表中的資料是基於公式的,則在打算修復缺少的 JSL 開始執行時,公式可能已「寫入」列,但可能尚未完成評估。 在程式碼運行之前,透過在程式碼前面添加以下行來確保所有公式都已完全更新:
Yields << run formulas;
4) 確保「Yields」沒有引用除感興趣的資料表之外的任何其他內容...不是列名、另一個變數名、表變數等。 因此,作為最佳實踐,我建議在用於指向表的任何變數名稱中的某處使用“dt”;雖然很容易想像透過無意中將值矩陣或向量命名為“Yields”來覆蓋表句柄“Yields”,但意外地將這樣的矩陣或向量命名為“YieldDt”的可能性要小得多。 但是,由於如果您暫停執行,您的程式就會工作,因此我不認為這是問題所在。
如果 1) 和 2) 適合您,而 3) 和 4) 都無法解決問題,我將需要更多資訊來幫助您:一個經過清理的範例表和一段可以針對該表運行的程式碼片段,以表明替換不適用於該表。
乾杯,
布雷迪
回覆:除非事後運行,否則部分腳本不會執行嗨馬克。 現在它單獨運行,但不能作為我的較大腳本的較小部分。 我想知道這是否不是一個腳本問題 - 更多的是另一個問題。 為什麼一段程式碼在單獨運行時會工作,而在作為較大腳本的較小部分運行時會失敗(即使最後執行時就像在第一種情況下一樣)?回覆:除非事後運行,否則部分腳本不會執行你好布雷迪,
我感謝所有的建議和幫助。 但是,您提供的這部分程式碼似乎對我不起作用(更改表名稱後)。 我覺得這很奇怪——我看不出為什麼它不起作用。 有任何想法嗎?
For( i = 1, i <= N Col( Yields ), i++,
Yields[Loc( Is Missing( Yields[0, i] ) ), i] = 0
);
稍微改變一下我的問題:我當前的程式碼在單獨運行時有效,但在作為較大程式碼的一小部分運行時則無效。 我覺得這本身很奇怪。 我很樂意更改我的程式碼,只是對我來說這似乎不是問題所在 - 因為(雖然不是“完美”)它確實有效! 這可能是個錯誤嗎? 或者有什麼方法可以解決這個問題? 我調試時也沒有錯誤。
回覆:除非事後運行,否則部分腳本不會執行另外,如果您有可能的行或列,請將nrows (dt) 或ncols (dt) 綁定到變數並將其用作上索引,因此不需要每次迭代都評估nrow(dt) 或ncol(dt )。
//do some stuff
);nc = ncol (dt);
for (i = 1, i<=nc, i++,
JMP 16 允許您使用 foreach( ) 迴圈來執行此操作,不要與 for every row( ) 混淆。 與基本的 for() 迴圈相比,For Each() 還具有一些其他優點,例如變數的局部作用域以及在某些情況下執行速度更快。 如果您正在使用 JMP 16,請務必檢查一下。
for each ( { i }, 1::nrow( dt ),
//do some stuff
);
回覆:除非事後運行,否則部分腳本不會執行另外,讓我先承認我從未使用過 For Each Row()。
曾經。
即使孩子免費吃飯也不行。
如果我必須循環行(我試圖避免這種情況,通過直接索引,就像我們在本例中所做的那樣,通過使用<< 獲取值並操作結果列表或矩陣等來一次性獲取列的值) , 我寫了一個合適的 for ( ) 迴圈。
我並不是說 For Each Row ( ) 永遠不會起作用。 我是說它帶有警告,但我不知道這些警告是什麼。 因此,我像瘟疫一樣避免使用 For Each Row () 並建議其他人也這樣做,除非他們都 1) 願意學習警告,並且 2) 願意假設那些編輯、維護或以其他方式與代碼交互的人未來也會如此。
後者不太可能發生,所以我從未考慮過採取前者。
乾杯,
布雷迪
for (i =1, i<=nrow(dt), i++,
//do some stuff
);
回覆:除非事後運行,否則部分腳本不會執行你好,
如果擔心大型表的效能,您不妨嘗試以下操作(注意,我使用 dt 作為表名)。 在中等表(100,000 行 x 5 列)上,我的機器上的效能差異非常明顯,分別為 0.0056 秒和 0.8261 秒。 這有幾個原因:
首先,Loc ( ) 和 Is Missing ( ) 函數速度很快,即使一次在整個列上使用也是如此,這就是我們在這裡所做的。 也就是說,dt[0, i] 會檢索整個 i 欄位。
此外,透過直接對列建立索引,我們不必處理取得它們的名稱,或從包含它們的清單中檢索它們。
乾杯,
布雷迪
Names Default To Here(1);
//create a table with roughly 10% missingness
dt = astable(J(1e5,5,randominteger(1, 20)/(randomuniform() > 0.1)));
For( i = 1, i <= N Col( dt ), i++,
dt[Loc( Is Missing( dt[0, i] ) ), i] = 0
);
回覆:除非事後運行,否則部分腳本不會執行//Recode columns in Yield Table to give "0" instead of X's
yieldcols = Yields << get column names;
For( col = 1, col <= N Items( yieldcols ), col++,
For Each Row( If( Is Missing( As Column( yieldcols[col] )[] ), As Column( yieldcols[col] )[] = 0 ) )
);
回覆:除非事後運行,否則部分腳本不會執行剛剛嘗試過。 即使單獨運行,這也不起作用。 我的原始腳本有效,但僅在單獨運行時有效(事實上,在整個腳本運行後,我按 Ctrl+R 執行該部分)。回覆:除非事後運行,否則部分腳本不會執行//Recode columns in Yield Table to give "0" instead of X's
yieldcols = Yields << get column names;
For( col = 1, col <= N Items( yieldcols ), col++,
For Each Row( If( Is Missing( As Column( yieldcols[k] )[] ), As Column( yieldcols[k] )[] = 0 ) )
);