2014-04-13 31 views
5

我怎樣才能找出發生錯誤的地方?找出調試時R在哪裏發生錯誤

我遇到這樣

companies <- # vector with all companies in my data.frame 
dates <- # vector with all event dates in my data.frame 

for(i in 1:length(companies)) { 
    events_k <- # some code that gives me events of one company at a time 

    for{j in 1:nrow(events_k)) { 
    # some code that gives me one event date at a time 
    results <- # some code that calculates stuff for that event date 

} 

mylist[[i]] <- results # store the results in a list 
} 

在這段代碼我得到一個錯誤雙循環(這是類似的錯誤在MAX(我)...) 內環完美的作品。因此,通過省去外部循環並手動輸入公司ID,直到出現該錯誤,我發現哪家公司出現了問題。我的data.frame中有一個矢量字母,每天都會爲特定公司返回。

下一次:有沒有一種方法在R找出哪裏(或這裏爲哪些公司)錯誤出現?它可以節省很多時間!

+2

一個簡單的方法是在每次循環運行中打印'i'&'j'',這樣您就知道它何時失敗... –

+0

第二個for循環中出現語法錯誤!你會得到這個錯誤:'錯誤:意外'{'in:'。我相信這種情況並不重要,但RStudio已經包含了一些調試工具。 – marbel

+2

輸入'traceback()'。另見'?debug','?trace','?browser','?recover' – GSee

回答

0

這是很難知道沒有明確的代碼,我們可以運行,但我的猜測是,改變你的代碼

for(i in companies) { 
    for(j in dates) { 

或可替代

for(i in 1:length(companies)) { 
    for(j in 1:length(dates)) { 

可以解決這個問題。請注意第二個循環中的(。如果不是,編輯您的示例以使一些代碼/數據產生相同的錯誤可能是一個好主意。

要確定它發生的位置,您可以隨時在代碼中的合適位置添加print(i)或類似的東西。

+0

aww是啊!實際上我使用了第二種方法。謝謝。我編輯了這個問題! – cptn

4

我喜歡用的是:

options(error = recover) 

你只需要在你的會話開始運行一次(或將其添加到您的.Rprofile文件)

之後,每次一個錯誤被拋出,你會看到導致錯誤的函數調用堆棧。您可以選擇這些調用中的任何一個,就像您在browser()模式下運行該命令一樣:您將能夠查看調用環境中的變量並遍歷代碼。

更多信息和示例在?recover