1

Rでエラーを処理するのに最適なものは何ですか? スクリプトのエンド ユーザーからスタック トレースを抽象化し、作業中の一時変数と状態をクリーンアップできるようにしたいと考えています。

したがって、私の質問は2つあると思います:

  1. 最も重要なのは、エラーを処理するときにクリーンアップ状態を適切に処理するにはどうすればよいですか?
  2. 内部情報を吐き出さずに、R のエラー メッセージから有用で有益な情報を抽出するにはどうすればよいですか?

現時点では、私はこのようなものを持っていますが、(1) ひどく洗練されていないように見え、(2) それでも恐ろしいエラー メッセージが表示されます。

# Create some temporary working state and variables to clean up
file <- "somefile"
working.dir <- getwd()
setwd("../")  # Go somewhere else
saf.default <- getOption("stringsAsFactors")
options(stringsAsFactors = FALSE)

# Now lets try to open the file, but it doesn't work (for whatever reason)
# I want to clean up the state, stop, and wrap the error string with a nicer
# message
tryCatch({
  # Need to embed the tryCatch because we still need some of the state variables
  # for the error message
  tryCatch({
    f <- read.table(file)
  }, error = function(err.msg) {
    # Can't clean up here, we still need the `file variable!
    stop("Could not open file '", file, "' with error message:\n", print(err.msg), 
         call.=FALSE)
  })
}, error = function(err.msg) {
  # Now we can clean up state
  setwd(working.dir)
  options(stringsAsFactors = saf.default)
  rm(file, working.dir, saf.default, 
     envir=globalenv())  # This also seems awful?
  stop(print(err.msg), call.=FALSE)
})

# Do more stuff, get more state, handle errors, then clean up.
# I.e can't use `finally` in previous tryCatch!

これからのエラーメッセージは、まだ多くの醜い内部として出てきます:

# <simpleError in file(file, "rt"): cannot open the connection>
# <simpleError: Could not open file 'somefile' with error message:
# Error in file(file, "rt"): cannot open the connection
>
# Error: Could not open file 'somefile' with error message:
# Error in file(file, "rt"): cannot open the connection
# In addition: Warning messages:
# 1: In file(file, "rt") :
#   cannot open file 'somefile': No such file or directory
# 2: In stop(print(err.msg), call. = FALSE) :
#   additional arguments ignored in stop()
>
4

1 に答える 1

2

状態を変更するコードを独自の関数に分離し、on.exit. これにより、エラーが発生してもクリーンアップが行われることが保証されます。

readFile <- function(.....)
{
    on.exit({
        setwd(cur.dir)
        options(stringsAsFactors=saf)
    })
    cur.dir <- getwd()
    saf <- getOption("stringsAsFactors")
    setwd("new/dir")
    options(stringsAsFactors=FALSE)
    ....
}
于 2013-06-17T06:26:39.020 に答える