2013-10-16 176 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

是的,谢谢。 –