2013-10-16 177 views
3

我有下列R-代碼:tryCatch R中不能正常工作

tryCatch({pre_symbol=read.table(file=filePre,header=FALSE,sep=",")} 
     , error = function(e) {loadError = TRUE}) 

當輸入文件(filePre)是空的,tryCatch不全局變量loadError設置爲TRUE。這會在我的代碼中產生問題(當loadError == false假定filePre不是空的時候執行的代碼)TryCatch應該阻止的問題。然而,當我刪除tryCatch聲明,並嘗試通過對函數read.table加載,我得到的錯誤

錯誤函數read.table中(文件= filePre,標題= FALSE,月= 「」):沒有 輸入中可用的線路

這是預期的情況。我不知道爲什麼這不起作用。它適用於我的集合中的大多數其他文件。

+2

這是不禮貌的標題你的問題「XXX不能正常工作,」這意味着一個錯誤的XXX。最好寫「不明白我做錯了XXX」 –

回答

8

你應該使用全局賦值運算符<<-這裏,例如:

loadError = FALSE 
toto <- function(){ 

    tryCatch(stop("dummy error"),error=function(e)loadError <<- TRUE) 
} 

> toto() 
> loadError 
[1] TRUE 
+0

這解決了這個問題!然而所有這些帖子都很有幫助!謝謝! – Erroldactyl

4

雖然<<-作品是肯定的,但它並不總是一個好主意,惹GlobalEnv。爲什麼不檢查錯誤和更新loadError,如果出事了 - 匿名函數之外沒有可能在頂層環境搞砸了的東西:

loadError <- inherits(tryCatch({ 
    pre_symbol = read.table(file = filePre, header = FALSE, sep = ",") 
}, error = function(e) e), 'error') 
+1

根據文檔,它並沒有明確的全局性:'操作符<<- and ->>通常只用於函數中,並且通過父環境進行搜索以獲得被賦值的變量的現有定義,所以'myLoadError << - TRUE'錯誤關閉更像是'assign(「myLoadError」,TRUE,pos = 1)' – Hansi

4

一些替代方案,以避免使用「全局分配」(這是除非在特定情況下沒有真正全球):

使用存在:

tryCatch({ 
    stop("Error") 
    pre_symbol <- "blah" 
}, error = function(e) { 
    print(e) 
}) 

if(exists("pre_symbol")){ 
    print(pre_symbol) 
} 

使用NULL:

pre_symbol <- NULL 
tryCatch({ 
    stop("Error") 
    pre_symbol <- "blah" 
}, error = function(e) { 
    print(e) 
}) 

if(!is.null(pre_symbol)){ 
    print(pre_symbol) 
} 

使用選項:

options(myLoadError=FALSE) 
tryCatch({ 
    stop("Error") 
    pre_symbol <- "blah" 
}, error = function(e) { 
    print(e) 
    options(myLoadError=TRUE) 
}) 

if(!isTRUE(getOption("myLoadError"))){ 
    print(pre_symbol) 
} 

使用環境:

loadErrors <- new.env(parent=emptyenv()) 
tryCatch({ 
    stop("Error") 
    pre_symbol <- "blah" 
}, error = function(e) { 
    print(e) 
    loadErrors[["pre_symbol"]] <- TRUE 
}) 

if(!isTRUE(loadErrors[["pre_symbol"]])){ 
    print(pre_symbol) 
} 

我個人傾向於使用NULL模式。

1

你可以只使用try()函數:

pre_symbol <- try(read.table(file=filePre,header=FALSE,sep=",")) 
loadError <- is(pre_symbol, 'try-error') 
+0

代碼中有一個類型(我猜)。它應該是: 'loadError < - 是(pre_symbol,'try-error')' –

+0

是的,謝謝。 –