2014-01-29 31 views
2

我正在運行我在多語言框架中編寫的優化程序。因爲我依靠不同的語言來完成任務,所以一切都必須是獨立的,因此可以通過批處理文件啓動。一切都很好,一直持續2-3個月,但當這個過程中的一個關鍵部分通過獨立的R腳本執行時,我遇到了一些新問題並給了我一個錯誤信息,所以我終於失去了運氣。此錯誤消息使得一切尖叫停了下來,儘管我盡了最大努力:如何避免停止執行遇到錯誤的獨立r腳本?

selMEM<-forward.sel(muskfreq, musk.MEM, adjR2thresh=adjR2) 
    Procedure stopped (adjR2thresh criteria) adjR2cum = 0.000000 with 0 variables (superior to -0.005810) 
    Error in forward.sel(muskfreq, musk.MEM, adjR2thresh = adjR2) : 
    No variables selected. Please change your parameters. 

我知道爲什麼我收到這樣的信息:它警告我說,不變量上面我已經編程正向選擇過程中保留門檻。雖然這在數百次運行中沒有發生,但這並不是什麼大事,我只需告訴R接下來要做什麼。這是我迷失的地方。經過對幾篇帖子的詳盡搜索(such as here)之後,它接近了try()和tryCatch()的路要走。所以,我曾嘗試以下:

selMEM<-try(forward.sel(muskfreq, musk.MEM, adjR2thresh=adjR2)) 

    if(inherits(selMEM, "try-error")) { 
     max<-0 
     cumR2<-0 
     adjR2<-0 
     pvalue<-NA 
    } else { 
     max<-dim(selMEM)[1] 
     cumR2<-selMEM$R2Cum[max] 
     adjR2<-selMEM$AdjR2Cum[max] 
     pvalue<-selMEM$pval[max] 
    } 

有問題的行之後的代碼完美地工作,如果我在R線執行它行,但是當我執行它從命令提示符一個獨立的腳本,我仍然得到同樣的錯誤消息,我的整個過程在執行之前的暫停之前停下來。

關於如何使這項工作的任何建議?

回答

3

注意這在try幫助:

try使用tryCatch實現;編程,而不是 try(expr, silent = TRUE),類似tryCatch(expr, error = function(e) e)(或其他簡單的錯誤處理函數)可能更有效率和靈活性。

查找到tryCatch,可能是:

selMEM <- tryCatch({ 
    forward.sel(muskfreq, musk.MEM, adjR2thresh=adjR2) 
}, error = function(e) { 
    message(e) 
    return(NULL) 
}) 

if(is.null(selMEM)) { 
    max<-0 
    cumR2<-0 
    adjR2<-0 
    pvalue<-NA 
} else { 
    max<-dim(selMEM)[1] 
    cumR2<-selMEM$R2Cum[max] 
    adjR2<-selMEM$AdjR2Cum[max] 
    pvalue<-selMEM$pval[max] 
} 
+0

感謝這個答案,這肯定看起來比我開始更有前途。然而,我遇到了和以前一樣的問題......如果我在R控制檯中逐行執行它(儘管出現了錯誤消息),那麼腳本可以在所有場景中很好地工作,但在獨立腳本中我:'tryCatchOne(expr,名稱,parentenv,處理程序[[1L]])中的錯誤:嘗試應用非函數'和'執行停止' –

+0

啊,我的錯。我相信'錯誤'需要一個功能。我做了一個編輯 - 嘗試一下。 –

+0

是的,我只是在鬼混,最後得到了幾乎相同的東西,我編輯了上面的腳本,以顯示最終的調整,使一切工作。非常感謝,您的意見非常寶貴! –

0

您是否嘗試在Try函數中將silent參數設置爲true?

max<-0 
cumR2<-0 
adjR2<-0 
pvalue<-NA 

try({ 
    selMEM <- forward.sel(muskfreq, musk.MEM, adjR2thresh=adjR2) 
    max<-dim(selMEM)[1] 
    cumR2<-selMEM$R2Cum[max] 
    adjR2<-selMEM$AdjR2Cum[max] 
    pvalue<-selMEM$pval[max] 
}, silent=T)