我有以下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出错(file = filePre,header = FALSE,sep =“,”):否 输入中可用的行
在这种情况下是预期的。我不知道为什么这不起作用。它适用于我的集合中的大多数其他文件。
答案 0 :(得分:8)
您应在此处使用全局赋值运算符<<-
,例如:
loadError = FALSE
toto <- function(){
tryCatch(stop("dummy error"),error=function(e)loadError <<- TRUE)
}
> toto()
> loadError
[1] TRUE
答案 1 :(得分:4)
尽管<<-
确实有效,但与GlobalEnv
混淆并不总是一个好主意。为什么不检查错误并在出现问题时更新loadError
- 在匿名函数之外,而不会在顶级环境中搞砸某些内容:
loadError <- inherits(tryCatch({
pre_symbol = read.table(file = filePre, header = FALSE, sep = ",")
}, error = function(e) e), 'error')
答案 2 :(得分: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模式。
答案 3 :(得分:2)
您可以使用try()函数:
pre_symbol <- try(read.table(file=filePre,header=FALSE,sep=","))
loadError <- is(pre_symbol, 'try-error')